[英]How can I set the value of a parameter that is not passed by reference in an Action<string, int>?
我有一个Action<object, object>
的列表,最终在某个时候或任何其他两种类型中将其返回到Action<string, int>
中。 它表示从一种类型到另一种类型的动态参照映射。 由于各种原因,我不能使用ref
或Func<..>
。
基本上,问题是在Action<string, int>
的回调代码中,我需要一种方法来设置传入的int
的值,例如,从字符串转换为int
后。 尽管由于它不是ref
,但如何执行尚不明显。
有人碰巧知道是否有办法动态重写该方法,或者获取传递给它的值(可能在堆栈上)并设置int
值...在CLR调用堆栈上迈出一步?
为了阻止任何人说“为什么不更改整个程序”或“什么时候需要它?”,我只是在尝试一种新型的对象映射库。
有趣的问题,我非常想知道根源答案!
到目前为止,我最好的方法是创建自己的委托,并将其包装为通用
delegate void MyAction<T,T1>(ref T a, T1 b);
static void Main(string[] args)
{
MyAction<string, int> action = Foo;
var arr = new object[] { "", 5 };
action.DynamicInvoke(arr);
}
private static void Foo(ref string a, int b)
{
a = b.ToString();
}
值类型不可能。 它们总是复制在堆栈上,并且在装箱的情况下(对于遇到的每个装箱)将它们移动到堆中的新位置,并将引用传递回去。
您可以尝试将int封装为引用类型并利用副作用(因为这正是您要执行的操作。或者您可以保留int参数并将结果存储在封闭变量中。例如: (string str, int i) => { myDictionary.Add(str, i); }
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.