C# Как передать класс Anon по ссылке - PullRequest
1 голос
/ 24 марта 2020

С помощью 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?

1 Ответ

3 голосов
/ 24 марта 2020

Какие изменения необходимы в коде C#, чтобы он работал идентично коду VB?

Вы не можете. Анонимные типы являются неизменяемыми в C# - в VB они являются изменяемыми по умолчанию, но свойства можно сделать неизменяемыми с помощью модификатора Key.

Если вам нужен изменяемый анонимный тип, значит, вы делаете это неправильно. Вместо этого используйте словарь или строгий тип. Или верните новый экземпляр, а не мутируйте переданный экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...