【问题标题】:C# How to Pass Anon Class by ReferenceC#如何通过引用传递匿名类
【发布时间】:2020-03-24 17:44:46
【问题描述】:

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

VB DotNetFiddle:

Public Module Module1

    Public Sub Main()
        Dim oAnon = New With {.A = "Coding", .B = "in", .C = "VB"}
        Console.WriteLine("Before: " + oAnon.ToString())
        MyFunction(oAnon)
        Console.WriteLine("After: " + oAnon.ToString())
    End Sub

    Public Sub MyFunction(ByRef o as Object)
        For Each p As Reflection.PropertyInfo In o.GetType().GetProperties()
            If p.CanRead Then
                If p.Name = "A" Then p.SetValue(o, "Moving", Nothing)
                If p.Name = "B" Then p.SetValue(o, "to", Nothing)
                If p.Name = "C" Then p.SetValue(o, "C#", Nothing)
            End If
        Next
    End Sub
End Module

我无法让类似的 C# 代码工作。 C# DotNetFiddle:

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);
            }
    }
}

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

这是所需的输出:

Before: { A = Coding, B = in, C = VB }
After: { A = Moving, B = to, C = C# }

问。需要对 C# 代码进行哪些更改才能使其与 VB 代码执行相同的操作?

【问题讨论】:

  • 您遇到什么错误?在哪一行?
  • 请注意,匿名类型已经引用类型,因此如果您不想更改实际引用,则不需要 ref 关键字。

标签: c#


【解决方案1】:

需要对 C# 代码进行哪些更改才能使其执行与 VB 代码相同的功能?

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

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

【讨论】:

  • 哇,还不知道匿名对象是不可变的,但显然是真的
  • 是的。原因是在执行连接和分组等操作时可以可靠地对它们进行哈希处理。修改用作哈希表键的对象可能会出现问题。
  • 谢谢@DStanley!我删除了 ref 关键字(一个误解)并传递了一个空字典来返回结果。 C# DotNetFiddle
猜你喜欢
  • 1970-01-01
  • 2014-05-05
  • 2011-01-19
  • 1970-01-01
  • 2018-06-20
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多