将泛型参数转换为子类

时间:2012-12-10 14:21:54

标签: c# generics covariance

请看下面的代码:

public class BaseClass
{
}

public class SubClass : BaseClass
{
}

public class QueryClass
{
    public TBaseClass[] QueryBase<TBaseClass>() where TBaseClass : BaseClass
    {
        throw new NotImplementedException();
    }

    public TSubClass[] QuerySub<TSubClass>() where TSubClass : SubClass
    {
        throw new NotImplementedException();
    }

    public TClass[] Query<TClass>() where TClass : BaseClass
    {
        if (typeof(TClass).IsSubclassOf(typeof(SubClass)))
        {
            return QuerySub<TClass>(); // there is error The type 'TClass' must be convertible to SubClass
        }

        return QueryBase<TClass>();
    }
}

问题是如何实现Query方法。如果有可能..

2 个答案:

答案 0 :(得分:1)

你要做的是做这样的事情:

public class Animal { }
public class Dog : Animal { }

public void HandleAnimal<T>() where T : Animal
{

}
public void HandleDog<T>() where T : Dog
{

}

在这种情况下,当您引用Animal时,无法知道它是什么typeof动物。即使该方法返回true,在代码的上下文中它仍然是Animal,当您只知道类型是dog时,您无法处理animal 。如果您正在处理方法中的对象实例,那么如果您知道它是一个子类,则可能会开始转换或实例化subclass,然后将其传递过来。

答案 1 :(得分:0)

结束反思。

        if (typeof(TClass).IsSubclassOf(typeof(SubClass)))
        {
            var method = typeof(QueryClass).GetMethod("QuerySub").MakeGenericMethod(typeof (TClass));

            return (TClass[]) method.Invoke(this, new object[0]);
        }