1

我有一个列表,Action<object, object>我最终会Action<string, int>在某个时候将其恢复为 an 或任何其他两种类型。它表示从一种类型到另一种类型的动态引用映射。由于各种原因,我不能使用refor Func<..>

基本上问题是,在回调代码中,Action<string, int>我需要一种方法来设置int传入的值,比如在我将它从字符串转换之后。虽然它不是ref,但如何做到这一点并不明显。

有没有人碰巧知道是否有一种方法可以动态地重写该方法,或者以其他方式获取传递给它的值(也许是在堆栈上)并设置该int值......在 CLR 调用堆栈上更上一层楼?

为了阻止任何人说“为什么不改变你的整个程序”或“你什么时候需要这个?”,我只是在尝试一种新的对象映射库的想法。

4

2 回答 2

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();
    }
于 2013-09-19T17:31:24.373 回答
0

值类型不可能。它们总是被复制到堆栈上,并且在装箱的情况下(对于遇到的每个装箱),它们被移动到堆中的一个新位置并传回一个引用。

您可以尝试将 int 包装成引用类型并利用副作用(因为这正是您想要做的。或者您可以保留 int 参数并将结果存储在封闭变量中。例如:(string str, int i) => { myDictionary.Add(str, i); }.

于 2013-09-19T17:14:18.383 回答