我正在使用通用工厂类,其中通用部分是正在使用的派生类.正常用法很明确:BaseClass< DerivedA> C = new BaseClass< DerivedA>().现在虽然我试图将属性注入到我使用这些类的类中.为此,我尝试将Type作为参数(这样我可以注入正在使用的派生类).
虽然我有点不知所措,尽管寻找例子并自己尝试.而我现在想知道:这样的构造是否可以使用?如果是这样,我如何实例化该类并使用Exists和ExistsB?
用法:
public class MyMainClass { object _ClassInstance; // BaseClass<DerivedA> or BaseClass<DerivedB> public MyyMainClass(Type typeIWant) { ..... } } .... MyMainClass a = new MyMainClass(typeof(DerivedA)); MyMainClass b = new MyMainClass(typeof(DerivedB));
通用类:
public abstract class BaseClass<T> where T: BaseClass<T>,new() { ... public bool Exists(int a) {...} }
派生类:
public class DerivedA :BaseClass<DerivedA> { ... } public class DerivedB :BaseClass<DerivedB> { ... public bool ExistsB(string a) {...} }
解决方法@H_404_18@
您可以使用以下方法创建任何类型的实例:
_ClassInstance = Activator.CreateInstance(typeIWant)
但是不建议使用它,因为当您想要使用其中一种BaseClass方法时,您将永远检查其类型并进行转换.如果您能够更改主类以获取类型参数,它应如下所示:
public class MyMainClass<T> where T: BaseClass<T>,new()
{
T _ClassInstance; // BaseClass<DerivedA> or BaseClass<DerivedB>
public MyMainClass()
{
_ClassInstance = new T();
}
}
这将允许您使用BaseClass上定义的任何方法.如果你想使用ExistsB,那么你仍然需要在运行时检查它的类型并进行转换.我会推荐这样的东西:
if (_ClassInstance is DerivedB derivedB)
derivedB.ExistsB("...");
_ClassInstance = Activator.CreateInstance(typeIWant)
但是不建议使用它,因为当您想要使用其中一种BaseClass方法时,您将永远检查其类型并进行转换.如果您能够更改主类以获取类型参数,它应如下所示:
public class MyMainClass<T> where T: BaseClass<T>,new() { T _ClassInstance; // BaseClass<DerivedA> or BaseClass<DerivedB> public MyMainClass() { _ClassInstance = new T(); } }
这将允许您使用BaseClass上定义的任何方法.如果你想使用ExistsB,那么你仍然需要在运行时检查它的类型并进行转换.我会推荐这样的东西:
if (_ClassInstance is DerivedB derivedB) derivedB.ExistsB("...");