创建多个类型的通用方法

时间:2012-02-08 16:39:15

标签: c# generics

我想写一个类似这样的方法:

public class BaseClass {}
public class DerivedClass1 : BaseClass {}
public class DerivedClass2 : BaseClass {}

public class BaseClassCreator
{
    public static T Create<T>() where T : BaseClass
    {
        if( T is DerivedClass1 ) return new DerivedClass1();
        if( T is DerivedClass2 ) return new DerivedClass2();

        return null;
    }
}

我收到编译错误,说我无法将DerivedClass1转换为T.我如何编写此方法来执行以下操作:

BaseClass x = BaseClassCreator.Create<DerivedClass1>();
BaseClass y = BaseClassCreator.Create<DerivedClass2>();

3 个答案:

答案 0 :(得分:4)

这看起来像是你可以利用new()约束

的情况
public static T Create<T>() where T : BaseClass, new()
{
  return new T();
}

答案 1 :(得分:3)

首先,a is T仅在左侧是实例而非类型时才有效。因此,您需要在双方都应用typeof(T)。然后,如果要检查类型是否相同,请使用==;或者IsAssignableFrom(...)以检查是否从另一个派生的是==。在您的情况下,您可能需要object

仅在插入已知基本类型时,强制转换才有效。哪个可以是BaseClasspublic static T Create<T>() where T : BaseClass { if( typeof(T) == typeof(DerivedClass1 )) return (T)(BaseClass)new DerivedClass1(); if( typeof(T) == typeof(DerivedClass2 )) return (T)(BaseClass)new DerivedClass2(); return null; }

{{1}}

但我不确定这首先是不是一个好主意。这段代码并不是通用的,因为它只适用于你硬编码的几个类。

答案 2 :(得分:3)

is(和as)关键字适用于实例,而非类型。我猜你真正想要的是

if(typeof(T) == typeof(DerivedClass1)) ....