使用命名参数动态调用方法

我们目前正在使用.NET 3.5,部分应用程序使用动态调用(使用MethodBase.Invoke )

我想知道是否可以在命名参数(在.NET 4中)与动态调用混合,执行类似于:

// Dictionary that holds parameter name --> object mapping var parameters = new Dictionary(); // Add parameters .... // Invoke where each parameter will match the one from the method signature. methodInfo.Invoke(obj, parameters); 

是否有任何API允许此选项开箱即用? 如果没有,是否有可能开发一些解决方案来执行此操作?

编辑:

重新思考这个问题,听起来类似于编译器实际上需要匹配基于参数列表的方法调用。 也许有一些编译器API(或新的Roslyn项目)可以轻松地做到这一点? (没有自己编码,可能容易出错)。

你可以使用这样的代码:

 public static class ReflectionExtensions { public static object InvokeWithNamedParameters(this MethodBase self, object obj, IDictionary namedParameters) { return self.Invoke(obj, MapParameters(self, namedParameters)); } public static object[] MapParameters(MethodBase method, IDictionary namedParameters) { string[] paramNames = method.GetParameters().Select(p => p.Name).ToArray(); object[] parameters = new object[paramNames.Length]; for (int i = 0; i < parameters.Length; ++i) { parameters[i] = Type.Missing; } foreach (var item in namedParameters) { var paramName = item.Key; var paramIndex = Array.IndexOf(paramNames, paramName); parameters[paramIndex] = item.Value; } return parameters; } } 

然后像这样调用它:

 var parameters = new Dictionary(); // Add parameters ... methodInfo.InvokeWithNamedParameters(obj, parameters); 

您可以在本文的帮助下获得您的参数名称如何获取方法参数的名称? 然后你可以重新排序它们来调用它们,如下所述:reflection:如何使用参数调用方法

使用.net4,我有一个开源框架ImpromptuInterface(在nuget中找到),可以很容易地使用DLR apis进行后期调用,包括命名/可选参数 。

 var result = Impromptu.InvokeMember(target, "MyMethod", parameters.Select(pair=> InvokeArg.Create(pair.Key, pair.Value)).Cast().ToArray());