Необходимо посмотреть во всех блоках, где дополнительный метод может быть определен.
Ищут классы, украшенные ExtensionAttribute
, и затем методы в том классе, которые являются также украшены ExtensionAttribute
. Тогда проверьте тип первого параметра, чтобы видеть, соответствует ли это типу, Вы интересуетесь.
Вот некоторый полный код. Это могло быть более строго (это не проверяет, что тип не вкладывается, или что существует по крайней мере один параметр), но это должно помочь Вам.
using System;
using System.Runtime.CompilerServices;
using System.Reflection;
using System.Linq;
using System.Collections.Generic;
public static class FirstExtensions
{
public static void Foo(this string x) {}
public static void Bar(string x) {} // Not an ext. method
public static void Baz(this int x) {} // Not on string
}
public static class SecondExtensions
{
public static void Quux(this string x) {}
}
public class Test
{
static void Main()
{
Assembly thisAssembly = typeof(Test).Assembly;
foreach (MethodInfo method in GetExtensionMethods(thisAssembly,
typeof(string)))
{
Console.WriteLine(method);
}
}
static IEnumerable<MethodInfo> GetExtensionMethods(Assembly assembly,
Type extendedType)
{
var query = from type in assembly.GetTypes()
where type.IsSealed && !type.IsGenericType && !type.IsNested
from method in type.GetMethods(BindingFlags.Static
| BindingFlags.Public | BindingFlags.NonPublic)
where method.IsDefined(typeof(ExtensionAttribute), false)
where method.GetParameters()[0].ParameterType == extendedType
select method;
return query;
}
}
Одна причина попытаться это - то, что возможно, что похожий метод был бы добавлен к фактическому классу разработчиком и, если бы это было, компилятор заберет тот метод.
единственный способ назвать старый метод Foo в той точке:
CustomerExtension.Foo(myCustomer);
Для прояснения мысли, Jon замял... "Добавление" дополнительного метода к классу не изменяет класс всегда. Это - просто определенное вращение выполненного компилятором C#.
Так, с помощью примера, можно записать
string rev = myStr.Reverse();
, но MSIL, записанный в блок, будет точно, как будто Вы записали его:
string rev = StringExtensions.Reverse(myStr);
компилятор просто позволяет Вам дурачить себя, заставляя думать, Вы называете метод Строки.