反思和延伸方法

时间:2011-12-19 14:07:07

标签: c# reflection

我在字符串类

上有一个扩展方法
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)方法为什么?其他包含方法在哪里?

3 个答案:

答案 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;