我有一个有一堆公共方法的类,我想反思它,找到可以用作特定委托的成员方法集。
例如:
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}集吗?如果是这样,怎么样?还有更好的方法吗?
答案 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参数和其他任何东西。测试驱动的开发在这里特别有用。