转换Template类的类型?

时间:2009-07-03 09:06:51

标签: c# generics templates type-conversion

我有一个名为“baseClass”的类。 从这个类我继承了一个类名“inheritedClass”(公共类inheritedClass:baseClass)

baseClass包含一个返回HashSet<baseClass>的公共函数。从inheritedClass调用时,返回类型显然仍为HashSet<baseClass>,但我需要HashSet<inheritedClass>

转换ala(HashSet<inheritedClass>)returnValue,其中returnValue属于HashSet<baseClass>类型不起作用。

有没有办法将HashSet-Type从baseClass转换为inheritedClass而不手动转换每个元素?

提前致谢, 弗兰克

2 个答案:

答案 0 :(得分:2)

你真的是指标签中的C#吗? HashMap是Java类型。它通常有两个类型参数而不是一个......

在C#中,泛型类总是不变的。 某些接口在C#4中变种,但很少(只有那些 在输出位置使用type参数的那些,例如{ {1}}或在输入位置使用type参数,例如IEnumerable<T>)。

如果您可以提供有关您情况的更准确信息,我们可能会帮助您提供一个简单的解决方案 - 特别是如果您可以使用LINQ及其IComparable<T>方法。

编辑:好的,Cast<T>()

HashSet<T>

请注意,即使使用C#4,这也是必要的,因为编译器不知道HashSet<BaseType> baseSet = ...; var derivedSet = new HashSet<DerivedType>(baseSet.Cast<DerivedType>()); 中的每个值都是baseSet的实例 - 必须进行执行时检查。相反(从DerivedType 创建HashSet<BaseType> 将在C#4中工作。

进一步编辑:如果您只想使用HashSet<DerivedType>,则不需要UnionWith - 它需要HashSet<DerivedType>。我建议你这样做:

IEnumerable<DerivedType>

答案 1 :(得分:1)

这是解决方案

//**Your BaseClass**
public class BaseClass<T> where T : BaseClass<T>
{
    public HashSet<T> GetHashSet()
    {
        HashSet<T> _hSet = new HashSet<T>();
        //do some work              
        //create a HashSet<T> and return;              
        return _hSet;
    }
}
//**Your Inherited/Derived Class**
public class InheritedClass : BaseClass<InheritedClass>
{
    //you have the method inherited as you need.}
}