请看下面的代码:
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方法。如果有可能..
答案 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]);
}