С помощью VB. net я могу передать анонимный класс по ссылке, а метод может изменить класс.
Да, я знаю, что он использует Reflection, но мне нужна возможность динамического c больше, чем мне нужна скорость.
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# }
Q. Какие изменения необходимы в коде C#, чтобы он работал идентично коду VB?