2015-09-02 4 views
0

У меня есть класс под названием Operations.cs с некоторым методом. Я хочу создать список делегатов для произвольного выбора метода. Сейчас у меня есть следующий рабочий раствор:Использование Reflection для автоматического создания списка делегатов

public delegate void Delmethod(ExampleClass supervisor); 
public static Operations op = new Operations(); 
public List<Delmethod> opList = new List<Delmethod>(); 

opList.Add(op.OpOne); 
opList.Add(op.OpTwo); 
opList.Add(op.OpThree); 
opList.Add(op.OpFour); 
opList.Add(op.OpFive); 
opList.Add(op.OpSix); 
opList.Add(op.OpSeven); 

Но что я действительно хочу создать список opList автоматически в случае, если я добавить новый метод в Operations.cs. Я пытался использовать отражение в atempt, чтобы решить мою проблему следующим образом:

List<MethodInfo> listMethods = new List<MethodInfo>(op.GetType().GetMethods().ToList()); 

foreach (MethodInfo meth in listMethods) 
{ 
    opList.Add(meth); 
} 

Я считаю, что это не работает, потому что я делаю путаницу о значении делегата, но я из идеи.

+0

Что вы собираетесь делать с этим списком? Если вы хотите вызвать эти методы в какой-то момент, вам нужно будет указать необходимые аргументы (это означает, что вам нужно знать количество и типы аргументов, которые будут поставляться ...). –

+0

Позже я буду случайным образом выбирать операцию в opList для вызова. Фактическое решение - это что-то вроде: Random rnd = new Random(); int random = rnd.Next (opList.Count()); opList [random] .Invoke (супервизор); –

ответ

2

Вам необходимо сделать делегат от конкретной информации о методе. Предполагая, что Operations имеет только публичный экземпляр methds с той же подписью, код будет выглядеть следующим образом:

public static Operations op = new Operations(); 
public List<Action<ExampleClass>> opList = new List<Action<ExampleClass>>(); 

oplist.AddRange(op 
    .GetType() 
    .GetMethods() 
    .Select(methodInfo => (Action<ExampleClass>)Delegate.CreateDelegate(typeof(Action<ExampleClass>), op, methodInfo))); 

Обратите внимание, что вам не нужно объявлять Delmethod, так как есть Action<T>.

+1

, например, opList [0] (new ExampleClass()) – Dennis

+0

Это решение работает, но не для моего случая, потому что я только хочу в своих опле определенных методах класса. Операции –

+0

Не могли бы вы сформулировать критерии для поиска методов? Фактически, в этом случае вам просто нужно фильтровать отраженные методы, используя заданные критерии. – Dennis

Смежные вопросы