2012-02-10 3 views
0

Я пытаюсь написать метод, который возвращает класс methodinfo из заданного ввода, с целью создания общей версии этого метода ... т. Е.MethodGroup как общий параметр

var m = myClass.GetType().GetMethod("SomeMethod").MakeGenericMethod(...blahblah..); 

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

Что я хотел бы сделать, это создать вспомогательный метод, с помощью которого я могу передать lamba, который указывает группу методов, таким образом я бы получил проверку времени метода имени метода, не говоря уже о intellisense и т. Д. ... т.е.

MethodInfo mi = myClass.GetMethodInfo(o => o.SomeMethod); 
m = mi.MakeGenericMethod(..blah...); 

Но я не был в состоянии выяснить метод подписи помощника ...

public MethodInfo GetMethodInfo(Func<MyClass,XXXX> lambda){ //What is my XXXX ? } 
+0

Что означает подпись вашей 'SomeMethod' выглядеть? –

+0

На самом деле это точка @ M.Babcock, они могут и, вероятно, будут разными, поэтому я хочу решить из группы методов, а не для конкретной сигнатуры метода. –

+0

Я не думаю, что это возможно, однако я могу ошибаться. 'Func' рассчитывает узнать, что передать лямбда, если вы не знаете, как это может быть? –

ответ

5

Вы можете сделать это так, но я озадачен, почему вам нужен для указания типа делегата. Без этого он не работает, но так как ниже работает BarMethod, это, кажется, не имеет значения, какой тип делегата:

public static void Main(String[] args) 
{ 
    Foo f = new Foo(); 
    Console.WriteLine(ForMethod(() => f.FooMethod()).Name); 
    Console.WriteLine(ForMethod(() => f.Foo2Method<String>()).Name); 
    Console.WriteLine(ForMethod(() => f.BarMethod("foo")).Name); 
    Console.ReadKey(); 
} 

public static MethodInfo ForMethod(Expression<Action> e) 
{ 
    var mi = ((MethodCallExpression) e.Body).Method; 
    if (mi.IsGenericMethod) 
     mi = mi.GetGenericMethodDefinition(); 
    return mi; 
} 

class Foo 
{ 
    public void FooMethod() { } 
    public void Foo2Method<T>() { } 
    public void BarMethod(String foo) { } 
} 
+0

Я думал об этом также, но на основе вопроса методы, скорее всего, будут универсальными методами, поэтому вам нужно будет проверить, является ли метод общим методом и получить определение базового метода. –

+0

Отредактировано, чтобы учесть эту возможность. Для чего это стоит, почти наверняка есть лучший способ. –

+0

+1 - Я стою исправлен. Хорошая работа! –

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