繁体   English   中英

如何设置Action中未通过引用传递的参数的值 <string, int> ?

[英]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>中。 它表示从一种类型到另一种类型的动态参照映射。 由于各种原因,我不能使用refFunc<..>

基本上,问题是在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM