gpt4 book ai didi

c# - 使用命名参数动态调用方法

转载 作者:行者123 更新时间:2023-11-30 13:12:10 30 4
gpt4 key购买 nike

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

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

// Dictionary that holds parameter name --> object mapping
var parameters = new Dictionary<string, object>();

// 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<string, object> namedParameters) {
return self.Invoke(obj, MapParameters(self, namedParameters));
}

public static object[] MapParameters(MethodBase method, IDictionary<string, object> 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);
if (paramIndex >= 0)
{
parameters[paramIndex] = item.Value;
}
}
return parameters;
}
}

然后这样调用它:

var parameters = new Dictionary<string, object>();
// Add parameters ...
methodInfo.InvokeWithNamedParameters(obj, parameters);

关于c# - 使用命名参数动态调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13071805/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com