泛型的C#问题

时间:2009-10-22 09:40:51

标签: c# generics

我有什么?

我有一个抽象类,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'

我知道如何解决这个问题?

提前致谢!

2 个答案:

答案 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;                
    }
}