C# C如何通过引用传递一个非类

C# C如何通过引用传递一个非类,c#,C#,使用VB.net,我能够通过引用传递匿名类,并且该方法能够修改该类。 是的,我知道它在使用反射,但我需要的是动态能力,而不是速度 我一直无法让类似的C代码工作。 该方法必须是对象,因为有大约500个不同的类被传递给这个方法 以下是所需的输出: Before: { A = Coding, B = in, C = VB } After: { A = Moving, B = to, C = C# } C代码中需要做哪些更改才能使其执行与VB代码相同 为了使C代码的执行与VB代码相同,需要对C代码进

使用VB.net,我能够通过引用传递匿名类,并且该方法能够修改该类。 是的,我知道它在使用反射,但我需要的是动态能力,而不是速度

我一直无法让类似的C代码工作。

该方法必须是对象,因为有大约500个不同的类被传递给这个方法

以下是所需的输出:

Before: { A = Coding, B = in, C = VB }
After: { A = Moving, B = to, C = C# }
C代码中需要做哪些更改才能使其执行与VB代码相同

为了使C代码的执行与VB代码相同,需要对C代码进行哪些更改

你不能。匿名类型在C中是不可变的-在VB中,默认情况下它们是可变的,但是可以使用键修饰符使属性不可变

如果您需要一个可变的匿名类型,那么您就做错了。改用字典或强类型。或者返回一个新实例,而不是改变传入的实例

为了使C代码的执行与VB代码相同,需要对C代码进行哪些更改

你不能。匿名类型在C中是不可变的-在VB中,默认情况下它们是可变的,但是可以使用键修饰符使属性不可变


如果您需要一个可变的匿名类型,那么您就做错了。改用字典或强类型。或者返回一个新实例,而不是改变传入的实例

你犯了什么错误?在哪一行?请注意,匿名类型已经是引用类型,因此如果不想更改实际引用,则不需要ref关键字。您会遇到什么错误?在哪一行?请注意,匿名类型已经是引用类型,因此如果不想更改实际引用,则不需要ref关键字。哇,我还不知道匿名对象是不可变的,但显然是真的。原因是,在执行连接和分组之类的操作时,可以可靠地对它们进行散列。修改用作哈希表键的对象可能会有问题。谢谢,@DStanley!由于误解,我删除了ref关键字,并传递了一个空字典以返回结果。哇,我还不知道匿名对象是不可变的,但这显然是真的。原因是,在执行连接和分组之类的操作时,可以可靠地对它们进行散列。修改用作哈希表键的对象可能会有问题。谢谢,@DStanley!由于误解,我删除了ref关键字,并传递了一个空字典以返回结果。
public static class Module1
{
    public static void Main()
    {
        var oAnon = new
        {
        A = "Coding", B = "in", C = "VB"
        }

        ;
        Object o = (object)oAnon;
        Console.WriteLine("Before: " + oAnon.ToString());
        MyFunction(ref o); // Unable to Cast oAnon to Object Inline
        Console.WriteLine("After: " + oAnon.ToString());
    }

    public static void MyFunction(ref object o)
    {
        foreach (System.Reflection.PropertyInfo p in o.GetType().GetProperties())
            if (p.CanRead)
            {
                if (p.Name == "A")
                    p.SetValue(o, "Moving", null);
                if (p.Name == "B")
                    p.SetValue(o, "to", null);
                if (p.Name == "C")
                    p.SetValue(o, "C#", null);
            }
    }
}
Before: { A = Coding, B = in, C = VB }
After: { A = Moving, B = to, C = C# }