Как мне построить List или Array Types из хранимого типа времени выполнения для их сравнения? - PullRequest
2 голосов
/ 05 июня 2019

ПРИМЕЧАНИЕ. Когда я изначально задавал этот вопрос, я включал IEnumerable.После некоторых ответов я понял, что этот вопрос был запутанным, потому что я смешивал интерфейсы и классы.Я удалил это.Теперь я спрашиваю только об этих трех типах классов:

  • тип, который представляет одну вещь
  • тип, который представляет список этих вещей
  • тип, представляющий массив этих вещей

Прежде чем отвечать, пожалуйста, убедитесь, что вы полностью понимаете, о чем я спрашиваю.Я НЕ спрашиваю о:

  • типах, которые являются производными от другого типа
  • типов, которые можно назначить из другого типа
  • типовкоторые реализуют некоторый интерфейс

Отредактированный вопрос:

Если я получил тип, используя typeof(), могу ли я каким-то образом использовать это для проверки типов, которые представляютсписки или массивы извлеченного типа?

Я хочу сделать это специально, чтобы я мог делать сравнения, чтобы выяснить, является ли неизвестный тип каким-либо другим конкретным типом или списком или массивом этого конкретного типа.

Вот пример кода.Объяснение находится ниже кода.

public void Example()
{
    Type k = typeof(Kitten);
    Type m = typeof(Whatever); //Could even be a List<Whatever> or Whatever[]

    Compare(k, m);
}


public void Compare(Type someType, Type otherType)
{
     Type ListOfSomeType = ?????;
     Type ArrayOfSomeType = ??????;

     if(otherType == someType)
          //otherType is a Kitten

     elseif(otherType == ListOfSomeType)
          //otherType is a List<Kitten>

     elseif(otherType == ArrayOfSomeType)
          //otherType is a Kitten[]
}

Дело в том, что функция Compare получает Type аргументов, содержащих типы.Он понятия не имеет, что они на самом деле.Но он должен быть в состоянии выяснить, относятся ли они к одному типу, или является ли второй тип списком ТИПА OF или массивом, хранящим объекты типа первого типа.

Я ввел вопросительные знаки (?????) для воображаемого кода, который я хотел бы использовать для создания типов коллекций.

Как я могу это сделать?Этот вопрос не является гипотетическим.

Ответы [ 2 ]

4 голосов
/ 05 июня 2019

Конечно, вы можете сделать это с помощью отражения.Это довольно просто.

Вы можете получить открытый тип для List<>, а затем использовать MakeGenericType для списка.И Type.MakeArrayType для массива.

public static void Compare(Type someType, Type otherType)
{
    var listOfSomeTypeType = typeof(List<>).MakeGenericType(someType);
    var arrayOfSomeTypeType = someType.MakeArrayType();

    Console.WriteLine("SomeType: {0}",someType.Name);
    Console.WriteLine("OtherType: {0}",otherType.Name);

    if(someType == otherType)
        Console.WriteLine("someType and otherType are the same");
    else if(listOfSomeTypeType == otherType)
        Console.WriteLine("otherType is a list of someType");
    else if(arrayOfSomeTypeType == otherType)
        Console.WriteLine("otherType is an array of someType");
    else
        Console.WriteLine("No match found");
}

Живой пример: https://rextester.com/HQH48424

0 голосов
/ 05 июня 2019
Type arrayOfSomeType = someType.MakeArrayType();
Type listOfSomeType = typeof(List<>).MakeGenericType(new[] { someType });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...