通过反射验证方法调用的一组参数的最简单方法是什么

时间:2014-07-17 17:59:46

标签: c# .net reflection

我想知道什么是验证具有要调用的MethodInfo和对象[]的对象数组的参数类型的最简单(或本机)方式。

示例:

让我说我有一个接收int类型参数的方法Foo。 通过反射我获得了方法的MethodInfo,从那里我可以调用invoke传递一个对象数组。

如果我调用invoke传递一个带有单个int的对象数组,那么它会没问题。 如果我调用invoke传递一个带有2个字符串的对象数组,那就不行了。

如何确保传递的调用对象与方法参数类型兼容。

1 个答案:

答案 0 :(得分:4)

在一般情况下,这可能非常复杂 - 本质上,您将实现编译器的一部分。幸运的是Type.IsAssignableFrom对类型转换了解很多,所以合理的第一次尝试将是

var compatible = methodInfo.GetParameters().Select(p => p.ParameterType)
                     .Zip(objArray, Tuple.Create)
                     .All(t => t.Item1.IsAssignableFrom(t.Item2.GetType()));

这会从MethodInfo中获取正式参数的类型,将它们与手头的实际对象配对,并确认每个对象都可以分配给相应类型的变量。