На самом деле, есть способ для этого, но это немного сложно.Если вы не забыли поместить ключевое слово this
в свой параметр метода расширения, компилятор C # отправит ExtensionAttribute этому методу и этому классу.Зная это, вы сможете найти этот метод расширения и выполнить его:
var myClassType = typeof(MyClass);
var myClass = new MyClass();
var assemblyTypes = Assembly.GetExecutingAssembly().GetTypes();
foreach (var type in assemblyTypes.Where(t => t.GetCustomAttribute<ExtensionAttribute>() != null)
{
var typeMethods = type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
foreach (var method in typeMethods.Where(m => m.IsDefined(typeof(ExtensionAttribute), inherit: false))
{
if (method.GetParameters()[0].ParameterType == myClassType)
{
// here you go
method.Invoke(null, new object[]{ myClass });
}
}
}
Если вы не уверены, в какой сборке искать метод расширения, вы можете попробовать поискать all :
var allLoadedTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes());
Обратите внимание: отражение медленно .Действительно медленно.Даже если вы фильтруете все свои типы с помощью .Where(type => type.IsSealed)
или любого другого фильтра, он все равно очень медленный .Если у вас есть какой-либо другой способ вызвать код в вашем методе расширения, вам, вероятно, следует использовать этот способ.