2012-02-08 35 views
2

我想编写的作品有点像这样的方法:通用的方法来创建多种类型

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>(); 
+0

同时,难道不这样,如果你真的回来了更容易了一大堆(T)激活.CreateInstance(typeof(T))? – 2012-02-08 16:45:03

+0

你的真实代码很简单吗?如果是,那么你实际上并没有做任何事情,'Activator.CreateInstance()'方法不会做。 – 2012-02-08 16:45:15

+0

不是那么简单。这只是为了证明我得到的错误。 – Dismissile 2012-02-08 16:52:12

回答

3

is(和as)关键字操作实例,而不是类型。即时猜测你真正想要的是

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

首先,a is T如果左边是一个实例,而不是一个类型仅适用。所以你需要在两边申请typeof(T)。然后,如果要检查类型是否相同,则使用==;如果要检查其他类型,则使用IsAssignableFrom(...)。在你的情况下,你可能需要==

只有插入已知的基本类型,转换才能正常工作。可以是objectBaseClass。我不确定这是不是一个好主意。这段代码并不是通用的,因为它只适用于你硬编码的几个类。

4

这看起来像一个情况下,你可以只利用了new()约束

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