我想写一个类似这样的方法:
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 :(得分:4)
这看起来像是你可以利用new()
约束
public static T Create<T>() where T : BaseClass, new()
{
return new T();
}
答案 1 :(得分:3)
首先,a is T
仅在左侧是实例而非类型时才有效。因此,您需要在双方都应用typeof(T)
。然后,如果要检查类型是否相同,请使用==
;或者IsAssignableFrom(...)
以检查是否从另一个派生的是==
。在您的情况下,您可能需要object
。
仅在插入已知基本类型时,强制转换才有效。哪个可以是BaseClass
或public 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)) ....