gpt4 book ai didi

c# - 为方法参数赋值

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

想象一个具有以下签名的方法:

public void ExampleMethod(string id, object data, 
ref object A, ref object B, ref object C)
{
//...
}

data 中的值需要分配给 ABC 或什么都不分配,具体取决于id 的值。简而言之,如果 id == "A" 那么 A = data;

问题在于此方法的主体是由人键入的,但签名是在运行时生成的。因此,不可能对逻辑进行硬编码,因为在设计时不知道将有多少个 ref 参数以及它们被称为什么。这段代码可以插入任意数量的方法中,每个方法都可能具有不同的签名,并且它必须在每个方法中都起作用。

我知道如何获取当前所在方法的所有参数,但我不知道如何为其中一个参数赋值。我正在寻找的是类似以下内容的内容:

public void ExampleMethod(string id, object data, 
ref object A, ???????, ref object Z)
{
MethodBase method = MethodBase.GetCurrentMethod();
foreach (ParameterInfo parameter in method.GetParameters())
{
if (id == parameter.Name)
{
// Problem: assign data to parameter.
return;
}
}
}

最佳答案

您不能通过名称访问参数,因为您不能真正对变量/参数使用反射。如果这是 IL,您可能有一些选择,但实际上不是在 C# 中。我的建议是:更改 API,可能涉及数组或(也许更好)字典。考虑:

public void ExampleMethod(string id, object data,
IDictionary<string,object> args) {
args[id] = data;
}

不确定这是否有帮助...但是您尝试做的事情并不是真正的反射友好。另一种选择是动态生成此方法,作为构建过程的一部分,或通过 IL。两者都应该没问题。所以它基本上可以生成(作为 C# 或(在运行时)IL):

public void ExampleMethod(string id, object data, 
ref object A, ref object B, ref object C)
{
switch(id) {
case "A": A = data; break;
case "B": B = data; break;
case "C": C = data; break;
default: /* do something */
}
}

另一种方法:类型化对象:假设您有:

public void ExampleMethod(string id, object data, SomeType obj) {...}

其中obj是一个对象,具有“A”、“B”、“C”等属性;那么您要生成的是:

switch(id) {
case "A": obj.A = data; break;
case "B": obj.B = data; break;
case "C": obj.C = data; break;
default: /* do something */
}

当然可以通过反射来完成:

var prop = obj.GetType().GetProperty(id);
prop.SetValue(obj, data, null);

或者如果性能很重要,则类似于 fast-member :

var wrapped = ObjectAccessor.Create(obj); 
wrapped[id] = data;

关于c# - 为方法参数赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9496646/

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