我有一个Action<object, object>
的列表,我最终会在某个时候或其他两种类型中将其重新置于Action<string, int>
。它表示从一种类型到另一种类型的动态参照映射。由于各种原因,我无法使用ref
或Func<..>
。
基本上问题是在Action<string, int>
的回调代码中我需要一种方法来设置传入的int
的值,比如在我从字符串转换它之后。虽然它不是ref
,但是如何做到这一点并不明显。
有没有人碰巧知道是否有办法动态地重写方法或以其他方式获取传递给它的值(也许是堆栈)并设置int
值...一步CLR调用堆栈?
要阻止任何人说“为什么不改变你的整个程序”或“你什么时候需要这个呢?”,我只是试验一种新的对象映射库的想法。
答案 0 :(得分:1)
有趣的问题,我非常想知道根本答案!
到目前为止,我最好的方法是创建自己的委托,并将它们包装在通用
中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();
}
答案 1 :(得分:0)
值类型无法实现。它们总是复制在堆栈上,如果是拳击(对于遇到的每个装箱),它们将被移动到堆中的新位置并传回引用。
你可以尝试将你的int包装成一个引用类型并利用副作用(因为这正是你想要做的。或者你可以保留int参数并将结果存储在一个封闭的变量上。例如: (string str, int i) => { myDictionary.Add(str, i); }
。