Как получить доступ к элементам в списке <T>, когда T хранится только в переменной типа? - PullRequest
0 голосов
/ 06 июня 2019

Я постараюсь прояснить это:

У меня есть объект типа System.Object, который содержит список вещей. Вещи определяются во время выполнения. В настоящее время я могу выяснить тип вещей, содержащихся в списке, но не могу понять, как получить к ним доступ.

Вот пример кода, где "o" - это список рассматриваемых вещей:

Пример:

//Assume at this point in code, we have access to "o"
//which is type System.Object

Type thingType = thing.GetType();
Type listType = typeof(List<>);
Type listOfThingsType = listType.MakeGenericType(thingType);

if (o.GetType() == listOfThingsType)
{
    //Now I know o contains a list of things
    //...but how do I access them and work with their members?

    //foreach thing in o
    //   operate on thing through reflection
}

РЕДАКТИРОВАТЬ (более подробно): Я использую отражение для доступа к свойствам членов вещей. Я не знаю, как называются эти свойства. Мне не нужно иметь возможность использовать обычный синтаксис C #. Мне просто нужен способ доступа к вещам, чтобы я мог использовать отражение на них как отдельные объекты.

Ответы [ 2 ]

0 голосов
/ 21 июля 2019

Спасибо HansPassant, который предложил использовать динамический.

Вот решение:

//Assume at this point in code, we have access to "o"
//which is type System.Object

Type thingType = thing.GetType();
Type listType = typeof(List<>);
Type listOfThingsType = listType.MakeGenericType(thingType);

if (o.GetType() == listOfThingsType)
{
    //Now I know o contains a list of things
    //...but how do I access them and work with their members?

    dynamic oList = o;
    foreach(object thing in oList)
    {
        //operate on thing through reflection
    }
}
0 голосов
/ 06 июня 2019

List<T> орудия IList.Если все, что вам нужно, это доступ к экземплярам, ​​которые составляют список для сериализации (или чего-то еще), используйте List вместо List<T>, поскольку кажется, что фактический тип может не иметь большого значения.Конечно, это может зависеть от используемого вами сериализатора (вы упомянули это в своем комментарии?).

Fiddle

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;

public class Program
{
    public class MyType 
    {
        public string Name {get;set;}
        public MyType(){}
        public MyType(string name) {
          this.Name = name;
        }

        public override string ToString()
        {
            return this.Name ?? "empty";
        }
    }

    public static void Main()
    {
        List<MyType> list = new List<MyType>();
        list.Add(new MyType("One"));
        list.Add(new MyType("Two"));
        DoSomethingWithUnknown(list);
    }

    public static void DoSomethingWithUnknown(object argList)
    {
        var list = (IList)argList;
        foreach(var item in list)
        {
            Console.WriteLine("As object: " + item);
            dynamic itm = item;
            Console.WriteLine("As dynamic: " + itm.Name);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...