Является ли разбор единственным способом получить тип Member? - PullRequest
4 голосов
/ 15 декабря 2010

Код отражения ниже возвращает:

System.Collections.Generic.IList`1[TestReflection.Car] Cars

Как я могу получить корневой тип Cars через отражение? Не IList<Car> - как я могу получить Car?

using System;
using System.Reflection;
using System.Collections.Generic;

namespace TestReflection
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            Type t = typeof(Dealer);
            MemberInfo[] mi = t.GetMember("Cars");

            Console.WriteLine("{0}", mi[0].ToString());
            Console.ReadLine();
        }
    }

    class Dealer
    {
        public IList<Car> Cars { get; set; }
    }

    class Car
    {
        public string CarModel { get; set; }
    }
}

Ответы [ 2 ]

12 голосов
/ 15 декабря 2010

Самый простой способ - создать PropertyInfo, который представляет рассматриваемое свойство, а затем его базовый тип через PropertyInfo.PropertyType. Тогда это просто вопрос получения аргументов типа для этого универсального типа, для которого вы можете использовать Type.GetGenericArguments.

Type carsElementType = typeof(Dealer)
                        .GetProperty("Cars") 
                        .PropertyType // typeof(IList<Car>)
                        .GetGenericArguments() // new[] { typeof(Car) }
                        .Single(); // typeof(Car)
1 голос
/ 15 декабря 2010

Вы берете объект Type для закрытого типа, а затем используете GetGenericArguments, который возвращает вам список всех типов, замененных общими параметрами.

var l = new List<int>();
foreach(var genericArg in l.GetType().GetGenericArguments())
   Console.WriteLine(genericArg);  // returns Int32
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...