C# Отражение - Получить Generi c Тип аргумента Суперкласса из Базового класса - PullRequest
1 голос
/ 12 марта 2020

Рассмотрим классы:

public class Super : Base<Test, Super>
{
    public Super Next { get; set; }
}

public class Base<TArg, TSuper>
{
    public Type GetTestArgument()
    {
        Type[] arguments = typeof(TSuper).GetProperty("Next").PropertyType.BaseType.GetGenericTypeDefinition().GetGenericArguments();
        // arguments is set to [ TArg, TSuper ] instead of [ Test, Super ]
        return arguments[0]; // should be Test
    }
}

Кто-нибудь знает, как получить тип generi c из базового класса, не вызывая typeof(TArg), потому что я буду перебирать свойства других суперклассов и это должно быть через более глубокое отражение.

Спасибо.

1 Ответ

2 голосов
/ 12 марта 2020

У вас есть звонок на GetGenericTypeDefinition(), который вы, вероятно, не хотите. Т.е.:

typeof(TSuper).GetProperty("Next").PropertyType.BaseType.GetGenericArguments()

typeof(TSuper).GetProperty("Next").PropertyType.BaseType возвращает тип Base<Test, Super>. Таким образом, вызов GetGenericArguments() для него возвращает [Test, Super].

Вызов GetGenericTypeDefinition() для этого дает вам Base<TArg, TSuper>, а вызов GetGenericArguments() для него возвращает [TArg, TSuper].

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