C# динамическое преобразование объекта на основе возвращаемого значения GetType () - PullRequest
0 голосов
/ 09 июля 2020

Я новичок в кодировании в C#, и я « ныряю в глубокие » с этим вопросом ... ?

В следующем коде в foreach l oop при первом проходе значение item.Name равно 'BB', а значение item.GetValue(b) возвращает 'ConsoleApp.A'.

Как я могу получить подробную информацию о item.GetValue(b)?

Я знаю, что:

  • item.GetValue(b).GetType().ToString() возвращает «ConsoleApp42.A»
  • ((A)item.GetValue(b)).AA возвращает «11»

Как я могу сделать это ((A)item.GetValue(b)).AA динамически? В этом примере всегда получается объект class A, но в моем реальном коде это может быть выбор из нескольких классов ...

class Program
{
    static void Main(string[] args)
    {
        A a = new A() { AA=11, BB=22, CC=33 } ;
        B b = new B() { BB = a, CC = 2, DD = 1 };
     
        foreach (var item in b.GetType().GetProperties())
        {
            Console.WriteLine("Name:{0}  Value:{1}", item.Name, item.GetValue(b));
        }

        Console.ReadLine();
    }
}

class A {
    public int AA { get; set; }
    public int BB { get; set; }
    public int CC { get; set; }
}

class B
{
    public A BB { get; set; }
    public int CC { get; set; }
    public int DD { get; set; }
}

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Или вот так?

        static void Main(string[] args)
        {
            A a = new A() { a1 = 11, a2 = 22, a3 = 33 };
            C c = new C() { c1 = 111, c2 = 222, c3 = 333 };
            B b = new B() { b1 = a, b2 = c, b3 = 1 };

            //iterate through b's properties
            foreach (var item in b.GetType().GetProperties())
            {
                var d = b.GetType().GetProperty(item.Name);
                var e = d.GetValue(b);

                //here we iterate through a's and c's properties (from b object)
                //it will print it's properties dynamically
                foreach (var f in e.GetType().GetProperties())
                {
                    Console.WriteLine("Name: {0} Value: {1}", f.Name, f.GetValue(e)) ;
                }
            }

            Console.ReadLine();
        }

        class A
        {
            public int a1 { get; set; }
            public int a2 { get; set; }
            public int a3 { get; set; }
        }

        class B
        {
            public A b1 { get; set; }
            public C b2 { get; set; }
            public int b3 { get; set; }
        }

        class C
        {
            public int c1 { get; set; }
            public int c2 { get; set; }
            public int c3 { get; set; }
        }

Выходы:

Name: a1 Value: 11
Name: a2 Value: 22
Name: a3 Value: 33
Name: c1 Value: 111
Name: c2 Value: 222
Name: c3 Value: 333
0 голосов
/ 09 июля 2020

Проверить тип и привести его к тому же типу, что и as. Если элемент не A, то as вернет null, поэтому вы можете использовать оператор объединения (??), чтобы определить, что выводить.

foreach (var item in b.GetType().GetProperties())
{
    object rawValue = item.GetValue(b);
    A typedValue = rawValue as A;
    string output = (typedValue?.AA ?? rawValue).ToString();
    Console.WriteLine("Name:{0}  Value:{1}", output );

}

или (это может быть легче следовать):

foreach (var item in b.GetType().GetProperties())
{
    object rawValue = item.GetValue(b);
    A typedValue = rawValue as A;
    if (typedValue == null)
    {
        Console.WriteLine("Name:{0} Value:{1}", rawValue);
    }
    else
        Console.WriteLine("Name:{0} Value:{1}", typedValue.AA);
    }
}

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