2009-06-26 4 views
4

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

Я читал this question о том, что некоторая часть относится к моему запросу, но не повезло.

+0

Насколько я понимаю, метод расширения не будет частью класса DataRow. Возможно, вам придется посмотреть на класс, в котором вы определили метод расширения, и найдите ExtensionMethodAttribute. – shahkalpesh

+0

Это ExtensionAttribute (а не ExtensionMethodAttribute). Извини за это. – shahkalpesh

+0

@shahkalpesh: Thnks, попробует .. –

ответ

11

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

Теперь, если все у вас есть объект, и вы пытаетесь найти конкретный метод расширения вы могли бы найти метод расширения в вопросе путем поиска всех ваши статических классов в области приложений для методов, которые имеют 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(); 
    } 
} 
+0

Означает ли это, что мне нужно получить ссылку MethoInfo из класса, который определяет ExtensionMethod, а затем вызывать его на объекте, на котором размещается ExtensionMethod во время выполнения ??? –

+0

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

+0

Значит, это означает, что он выкинет исключение, когда я попытаюсь получить ссылку. –

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