2013-10-11 1 views
1

Единственно ради примера я написал это:Изменить модификатор доступа во время выполнения

public class MyClass 
{ 
    private int MyMethod() 
    { 
     return 1; 
    } 
} 

Есть любого способа изменить модификатор доступа MyClass::MyMethod() во время выполнения для общественного с помощью отражения или что-то else, а затем вызвать его?

+0

Довольно уверен, что вы можете использовать отражение для вызова метода без изменения модификатора доступа с помощью метода MethodInfo.Invoke. –

ответ

5

Не совсем уверен, если вы можете изменить спецификатор доступа, но вы можете вызвать частный метод посредством отражения, как:

MyClass instance = new MyClass(); 
MethodInfo yourMethod = instance 
          .GetType() 
          .GetMethod("MyMethod", BindingFlags.NonPublic | BindingFlags.Instance); 
var returnValue = yourMethod.Invoke(instance, new object[] { }); 
Console.WriteLine(returnValue); 
+0

Большое спасибо, это сработало. Не могли бы вы объяснить, почему вы использовали 'BindingFlags.Instance'? – Netherwire

+1

@RomanChehowsky, его метод экземпляра, попробуйте с помощью частного статического метода, а затем используйте 'BindingFlags.Static' – Habib

+0

еще раз, но я уже ответил на этот вопрос :) – Netherwire

1

Нет, класс, что это такое, и вы не можете изменить его во время выполнения ,

Вы можете создать новый класс, в котором есть члены, за исключением того, что MyMethod будет общедоступным, но он не будет тем же классом.

В любом случае, я не могу думать о ситуации, когда что-то подобное делало бы какой-то смысл.

+0

Вы правы, это кажется бессмысленным, но я хотите знать, как с этим бороться. – Netherwire

+0

У меня есть намеренное использование для этого, что имеет смысл. Я генерирую DbContext в EF6, и я обертываю его с помощью одноэлементного класса. Теперь я хочу, чтобы люди ТОЛЬКО имели доступ к моей оболочке singleton и НЕ созданному классу DbContext (потому что он генерируется как открытый). Я хочу быть в состоянии сказать во время выполнения, чтобы сделать его внутренним, чтобы другие сборки ИМЕЛИ использовать мою оболочку. Прямо сейчас, то, что я делаю, меняет его вручную каждый раз, когда я обновляю часть EF кода, чтобы переопределить модификатор общедоступного доступа. –