我在字符串类
上有一个扩展方法public static bool Contains(this string original, string value, StringComparison comparisionType)
{
return original.IndexOf(value, comparisionType) >= 0;
}
但不可能通过反思获得方法
IEnumerable<MethodInfo> foundMethods = from q in typeof(string).GetMethods()
where q.Name == "Contains"
select q;
foundMethods只获取Contains(string)方法为什么?其他包含方法在哪里?
答案 0 :(得分:3)
这不是String
类声明的方法,因此GetMethods
无法看到它。扩展方法在范围内的事实取决于声明它的命名空间是否已导入,并且反射对此没有任何了解。请记住,扩展只是静态方法,使用语法糖使它看起来像是实例方法。
答案 1 :(得分:1)
您无法使用问题中列出的简单反射方法来查找扩展方法。
您必须在类和方法上查看 ExtensionAttribute ,并验证第一个参数类型是字符串。由于可以在任何程序集中定义扩展方法,因此您必须对感兴趣的程序集执行此操作
答案 2 :(得分:0)
您的Contains方法不在String类中,因此,您无法使用typeof(string).GetMethods()获取Contains方法。
要获得所需,您可以使用代码
public partial String
{
public static bool Contains(this string original, string value, StringComparison comparisionType)
{
return original.IndexOf(value, comparisionType) >= 0;
}
}
但代码有一个问题,String类不能是静态的,所以你不能使用这个参数。
所以你应该在任何静态类中定义这个Contains方法。
您可以使用代码获取:
public static StringDemo
{
public static bool Contains(this string original, string value, StringComparison comparisionType)
{
return original.IndexOf(value, comparisionType) >= 0;
}
}
IEnumerable<MethodInfo> foundMethods = from q in typeof(StringDemo).GetMethods()
where q.Name == "Contains"
select q;