如何在C#中使用反射来查找满足特定委托要求的类的所有成员?

时间:2009-07-22 21:05:46

标签: c# reflection delegates

我有一个有一堆公共方法的类,我想反思它,找到可以用作特定委托的成员方法集。

例如:

delegate void InterestingFunc(int i);

class Entity
{
    public void F();
    public void G();
    public void H(int i);
    public void X(int i);
}

我可以使用Type.FindMembers()来取出{H,X}集吗?如果是这样,怎么样?还有更好的方法吗?

3 个答案:

答案 0 :(得分:4)

Type中没有固有的查询支持,可以根据委托签名查找方法。您需要手动编写一个搜索方法,该方法通过方法和属性循环比较签名与建议委托的签名。

这本身就是一项非常重要的操作,因为您需要将解决方案中的泛型考虑在内。

答案 1 :(得分:1)

  

这本身就是一项非常重要的操作   因为你需要把泛型带入   帐户与您的解决方案。

100%正确 - 更不用说ref / out参数,param[]修饰符以及不安全指针。

一个非最佳选项是将Delegate.CreateDelegate应用于Entity中的每个方法,并记下构造失败的时间。失败表示不兼容的方法。

同样,您可能需要做一些工作来处理泛型方法的情况。

答案 2 :(得分:1)

这是一个开始:

   MethodInfo[] FindMethods(Type delegateType, Type sourceType)
    { 
      var dInfo       = delegateType.GetMethod("Invoke");
      var dParamTypes = delegateInfo.GetParameters().Select(p=>p.ParameterType);

      var methods = from methodInfo in sourceType.GetMethods()
                    let mParamTypes = methodInfo.GetParameters()
                                                .Select(p=>p.ParameterType)
                    where    methodInfo.ReturnType == delegateInfo.ReturnType
                          && mParamTypes.SequenceEqual(dParamTypes)
                    select methodInfo;

      return methods.ToArray();
    }

可以扩展它以考虑泛型,ref / out参数和其他任何东西。测试驱动的开发在这里特别有用。