Вызвать метод общего расширения для объекта? - PullRequest
4 голосов
/ 26 июня 2009

Я создал универсальный метод расширения для объекта DataRow. Метод не имеет аргументов. Я хочу, чтобы вызвать общий метод через отражение, используя MethodInfo. Я могу сделать это для общедоступных методов Normarl, но почему-то не могу получить ссылку на метод Generic Extension.

Я прочитал этот вопрос на SO, который иногда относится к моему запросу, но не повезло.

1 Ответ

11 голосов
/ 26 июня 2009

Имейте в виду, что методы расширения являются хитростями компилятора. Если вы посмотрите статический метод в статическом классе, где определен метод расширения, вы можете вызвать его просто отлично.

Теперь, если все, что у вас есть, это объект, и вы пытаетесь найти конкретный метод расширения , вы можете найти соответствующий метод расширения, выполнив поиск во всех ваших статических классах в домене приложения для методов, которые имеют System.Runtime.CompilerServices.ExtensionAttribute и конкретное имя метода и последовательность параметров в вопросе.

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

Простой подход заключается в следующем (при условии, что вы ищете универсальный метод):

static class Extensions {
    public static T Echo<T>(this T obj) {
        return obj;
    }
}

class Program {

    static void Main(string[] args) {

        Console.WriteLine("hello".Echo());

        var mi = typeof(Extensions).GetMethod("Echo");
        var generic = mi.MakeGenericMethod(typeof(string));
        Console.WriteLine(generic.Invoke(null, new object[] { "hello" }));

        Console.ReadKey();
    }
}
...