Определите, какой объект родового типа является производным от - PullRequest
2 голосов
/ 19 мая 2011

У меня есть следующие классы:

public abstract class CommandBase
{
... Stuff
}

public abstract class Command<TArgumentType>  
           : CommandBase where TArgumentType : class
{
    protected TArgumentType Argument { get; private set; }

    protected Command(TArgumentType argument)
    {
        Argument = argument;
    }
}

public abstract class Command<TArgumentType, TReturnType>  
           : Command<TArgumentType> where TArgumentType : class
{
    public TReturnType ReturnValue{ get; protected set; }

    protected Command(TArgumentType argument) : base(argument)
    {
    }
}

Как определить, относится ли объект к типу Command<TArgumentType> или Command<TArgumentType, TReturnType>? Я не знаю, какие конкретные типы TArgumentType или TReturnType являются. Или я должен просто сделать попытку / поймать:

var returnValue = object.ReturnValue;

1 Ответ

4 голосов
/ 19 мая 2011

Если вы не знаете тип во время компиляции, то foo.ReturnValue даже не скомпилируется, если только он не имеет тип dynamic.

Вы можете использовать что-токак это:

static bool ContainsGenericClassInHierarchy(object value,
                                            Type genericTypeDefinition)
{
    Type t = value.GetType();
    while (t != null)
    {
        if (t.IsGenericType
            && t.GetGenericTypeDefinition() == genericTypeDefinition)
        {
            return true;
        }
        t = t.BaseType;
    }
    return false;
}

Назовите это так:

// Single type parameter
bool x = ContainsGenericClassInHierarchy(foo, typeof(Command<>));
// Two type parameters
bool y = ContainsGenericClassInHierarchy(foo, typeof(Command<,>));

Обратите внимание, что этот не будет работать для поиска реализованных интерфейсов, что несколько сложнее.

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