我有什么?
我有一个抽象类,QueryExecutor
和派生类,SqlQueryExecutor
如下所示。
abstract class QueryExecutor<T>
{
public abstract T Execute();
}
class SqlQueryExecutor<T> : QueryExecutor<T> where T:ICollection
{
public override T Execute()
{
Type type = typeof(T);
// Do common stuff
if (type == typeof(ProfileNodeCollection))
{
ProfileNodeCollection nodes = new ProfileNodeCollection();
// Logic to build nodes
return (T)nodes;
}
else
{
TreeNodeCollection nodes = new TreeNodeCollection();
Logic to build nodes
return (T)nodes;
}
}
}
我想做什么?
在Execute()
方法的实现中,我想构造适当的ICollection
对象并将其返回。
我面临什么问题?
在Execute()
方法中,行return (T)nodes;
显示以下编译时错误:
无法将'WebAppTest.ProfileNodeCollection'类型转换为'T'
我知道如何解决这个问题?
提前致谢!
答案 0 :(得分:4)
好吧,修复它的一个简单方法就是让编译器 less 意识到发生了什么,以便它只是将它推迟到CLR:
return (T)(object)nodes;
您可以将其放在一个位置,并在分配时使用隐式转换为object
:
object ret;
// Do common stuff
if (type == typeof(ProfileNodeCollection))
{
ProfileNodeCollection nodes = new ProfileNodeCollection();
// Logic to build nodes
ret = nodes;
}
else
{
TreeNodeCollection nodes = new TreeNodeCollection();
Logic to build nodes
ret = nodes;
}
return (T)ret;
这不是非常令人愉快,但应该有效。为不同的集合类型创建单独的派生类可能会更好 - 可能将公共代码放在抽象基类中。
答案 1 :(得分:1)
我会选择在此处分开关注。您甚至可以拥有QueryExecutor
工厂,根据收集类型提供正确的QueryExecutor
。
class ProfileSqlQueryExecutor : QueryExecutor<ProfileNodeCollection>
{
public override ProfileNodeCollection Execute()
{
ProfileNodeCollection nodes = new ProfileNodeCollection();
// Logic to build nodes
return nodes;
}
}
class TreeSqlQueryExecutor : QueryExecutor<TreeNodeCollection>
{
public override TreeNodeCollection Execute()
{
TreeNodeCollection nodes = new TreeNodeCollection();
Logic to build nodes
return nodes;
}
}