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