我想调用一个使用反射的方法。MethodInfo.Invoke参数顺序
事情是这样的:
method.Invoke(instance, propValues.ToArray())
的问题是,没有办法保证的参数数组在正确的顺序。有没有一种方法来具体哪些值按名称参数?或者我真的必须制作一个自定义联编程序?如果是这样,任何人都可以引导我在正确的方向吗?
我想调用一个使用反射的方法。MethodInfo.Invoke参数顺序
事情是这样的:
method.Invoke(instance, propValues.ToArray())
的问题是,没有办法保证的参数数组在正确的顺序。有没有一种方法来具体哪些值按名称参数?或者我真的必须制作一个自定义联编程序?如果是这样,任何人都可以引导我在正确的方向吗?
有没有一种方法来具体哪些值按名称参数?
那么,你可以按参数顺序指定它们。因此,如果您想要将特定值映射到特定名称,则应该使用method.GetParameters
获取参数列表并以这种方式映射它们。例如,如果您有相关的参数Dictionary<string, object>
:
var arguments = method.GetParameters()
.Select(p => dictionary[p.Name])
.ToArray();
method.Invoke(instance, arguments);
编辑:这个答案集中在参数类型不是参数名称。如果代码被混淆(或者具有不同的参数名称),那么很难映射Jon Skeet提供的解决方案。
反正我已经玩这个有很多....这是最适合我(不知道名字PARAM):
public object CallMethod(string method, params object[] args)
{
object result = null;
// lines below answers your question, you must determine the types of
// your parameters so that the exact method is invoked. That is a must!
Type[] types = new Type[args.Length];
for (int i = 0; i < types.Length; i++)
{
if (args[i] != null)
types[i] = args[i].GetType();
}
MethodInfo _method = this.GetType().GetMethod(method, types);
if (_method != null)
{
try
{
_method.Invoke(this, args);
}
catch (Exception ex)
{
// instead of throwing exception, you can do some work to return your special return value
throw ex;
}
}
return result;
}
所以,你可以调用上面的函数:
object o = CallMethod("MyMethodName", 10, "hello", 'a');
以上的通话将应该能够调用此方法相匹配的签名:
public int MyMethodName(int a, string b, char c) {
return 1000;
}
请注意他上面的例子在'this
'
如果存在多个具有相同类型的参数,但您仍然会被破坏... – 2012-07-17 18:06:19
即使有相同的类型,也会调用正确的方法。相信我,你应该尝试一下。 – KMX 2012-07-17 19:21:05
重读您的答案后,我相信您完全错过了这个问题的要点。你给出的例子有正确顺序的参数。 OP的全部问题是参数*不一定按照正确的顺序排列。他已经有了正确的方法,但他不知道如何传递参数,以便它们与参数一致。 – 2012-07-17 19:25:27
范围内我不能使用它,因为有关ASP.NET MVC框架的一些复杂性。但是,这100%回答了这个问题。谢谢! – Pluc 2012-07-17 17:55:34
我试过这种方法,但不断收到“给定的密钥不在字典中。” 我错过了什么? – Jacques 2014-07-10 07:59:55
@Jacques:那么,这将表明有一个参数,你没有在你的字典中指定... – 2014-07-10 08:04:35