Определите, был ли тип члена класса определен как параметр generi c - PullRequest
1 голос
/ 05 февраля 2020

Учитывая обобщенный c класс:

public class Foo<T>
{
    public T Data { get; set; }
    public string Bar { get; set; }
}

Объявлен как:

var someVar = new Foo<string>();

Есть ли способ определить, определен ли тип Data как обобщенный c T, а не строка?

Я знаю, что вы можете проверить, является ли тип Data строкой, но я хочу определить, определен ли член с помощью универсального c параметра.

Я не пытаюсь определить, является ли Data строкой. Я пытаюсь проверить, был ли Data определен Т. Я не думаю, что это возможно.

1 Ответ

2 голосов
/ 05 февраля 2020

Вы должны go через определение типа generi c, в котором свойства, использующие параметры типа generi c, будут по-прежнему открыты:

void Main()
{
    Test(typeof(Foo<string>), "Data");
    Test(typeof(Foo<string>), "Bar");
}

public void Test(Type type, string propertyName)
{
    if (type.IsGenericType)
        type = type.GetGenericTypeDefinition();

    PropertyInfo pi = type.GetProperty(propertyName);
    if (pi.PropertyType.IsGenericTypeParameter)
        Console.WriteLine("<generic> " + pi);
    else
        Console.WriteLine("<not generic> " + pi);
}

public class Foo<T>
{
    public T Data { get; set; }
    public string Bar { get; set; }
}

Вывод:

<generic> T Data
<not generic> System.String Bar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...