【发布时间】:2020-03-24 17:44:46
【问题描述】:
使用 VB.net,我可以通过引用传递一个匿名类,并且该方法可以修改该类。
是的,我知道它使用反射,但我需要动态功能而不是速度。
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#