[英]Assign value to method parameter
想象一下具有以下签名的方法:
public void ExampleMethod(string id, object data,
ref object A, ref object B, ref object C)
{
//...
}
data
的值需要分配给A
, B
, C
或什么都不需要,具体取决于id
的值。 简而言之,如果id == "A"
则A = data;
问题是这个方法的主体是由人类输入的,但签名是在运行时生成的。 因此,不可能对逻辑进行硬编码,因为在设计时未知有多少参考参数以及它们被称为什么。 这段代码可以插入到任意数量的方法中,每个方法可能具有不同的签名,并且它必须在每个方法中工作。
我知道如何获取当前方法的所有参数,但我无法弄清楚如何为这些参数中的一个赋值。 我正在寻找的是如下:
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);
或者如果性能至关重要,那就像快速成员 :
var wrapped = ObjectAccessor.Create(obj);
wrapped[id] = data;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.