C# 如何设置操作中未通过引用传递的参数值<;字符串,int>;?

C# 如何设置操作中未通过引用传递的参数值<;字符串,int>;?,c#,reflection,dynamic-programming,C#,Reflection,Dynamic Programming,我有一个Action的列表,我最终会在某个时候将其返回到Action或任何其他两种类型。它表示从一种类型到另一种类型的动态引用映射。由于各种原因,我无法使用ref或Func 基本上,问题是在操作的回调代码中,我需要一种方法来设置传入的int的值,比如从字符串转换后。虽然它不是ref,但如何做并不明显 是否有人知道是否有方法可以动态重写该方法,或者获取传递给它的值(可能是堆栈上的值)并设置int值。。。CLR调用堆栈上的一个步骤 为了阻止任何人说“为什么不改变你的整个程序”或“你什么时候会需要它?

我有一个
Action
的列表,我最终会在某个时候将其返回到
Action
或任何其他两种类型。它表示从一种类型到另一种类型的动态引用映射。由于各种原因,我无法使用
ref
Func

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

是否有人知道是否有方法可以动态重写该方法,或者获取传递给它的值(可能是堆栈上的值)并设置
int
值。。。CLR调用堆栈上的一个步骤


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

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


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

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


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

有趣的问题,我非常想知道根本答案

到目前为止,我最好的方法是创建您自己的委托,并将它们封装在通用的

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();
    }
委托无效MyAction(参考T a,T1 b);
静态void Main(字符串[]参数)
{
MyAction=Foo;
var arr=新对象[]{',5};
行动.动力Voke(arr);
}
私有静态void Foo(参考字符串a,int b)
{
a=b.ToString();
}

有趣的问题,我非常想知道根本答案

到目前为止,我最好的方法是创建您自己的委托,并将它们封装在通用的

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();
    }
委托无效MyAction(参考T a,T1 b);
静态void Main(字符串[]参数)
{
MyAction=Foo;
var arr=新对象[]{',5};
行动.动力Voke(arr);
}
私有静态void Foo(参考字符串a,int b)
{
a=b.ToString();
}

如果不是
ref
您就不能更改调用者的值。您可以返回新值,允许调用者更改它,但是除非传递引用,否则每个int的版本都是不同的和隔离的。实际上,您可以更改调用者的值。您可以在运行时将该方法重写为pass由ref和诸如此类的方法定义,但这不是一个很好的解决方案,我正在尝试提出一个更好的解决方案。如果不是
ref
,则不能更改调用者值。您可以返回新值,允许调用者更改它,但除非传递引用,否则每个int的版本都是不同的和隔离的。我们实际上,你可以更改调用方的值。你可以在运行时重写该方法,以通过ref和诸如此类的方式传递,但这不是一个很好的解决方案,我正在尝试想出一个更好的解决方案。值类型并不总是复制到堆栈上,因此我很难相信根据你所写的内容这是不可能的。但是,我正在寻找g在运行时反射调用者和被调用者CIL,以便做我想做的事情,并通过玩堆栈访问装箱引用。这不是真的。如果参数有
ref
修饰符,那么它不会被复制,只是被别名。问题是如何将
ref
修饰符添加到代理中。如果您添加了无法修改委托以使用
ref
参数的约束,则此答案是正确的,并且您需要将值类型包装在引用类型中。如果仅当参数通过引用传递,则引用值不会被复制,而是被引用。但操作委托没有任何ref modif根据任何定义,精心设计“玩堆栈”值类型并不总是复制到堆栈上,因此根据您所写的内容,我很难相信这是不可能的。但是,我正在考虑在运行时反射调用者和被调用者CIL,以便执行我想要的操作,并以某种方式通过使用堆栈访问装箱引用。这不是真的。如果参数具有
 ref
修饰符,则它不会被复制,只是有别名。问题是如何将
ref
修饰符添加到代理中。如果您添加了无法修改代理以使用
ref
参数的约束,则此答案将是正确的,并且您需要将值类型包装在引用t中ype.True,仅当参数通过引用传递时,引用值不会被复制,而是被引用。但操作委托在任何定义上都没有任何引用修饰符。详细说明“使用堆栈”因此,问题是
操作
无法更改。如果我将其包装在
操作
中,那么它会被提升一级,而不是两级,如果它被包装,这就是它需要的。如果它没有被包装,它只需要再提升一级。是的,它是o