MethodGroup как универсальный параметр - PullRequest
0 голосов
/ 10 февраля 2012

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

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

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

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

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

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

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

1 Ответ

5 голосов
/ 10 февраля 2012

Вы можете сделать это следующим образом, но я озадачен тем, почему вам нужно указать тип делегата. Без этого это не сработает, но поскольку приведенное ниже работает для 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) { }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...