gpt4 book ai didi

c# - 使用类型实例化使用受限泛型的派生类

转载 作者:太空狗 更新时间:2023-10-29 20:26:37 26 4
gpt4 key购买 nike

我正在使用通用工厂类,其中通用部分是正在使用的派生类。正常用法一目了然:BaseClass<DerivedA> C = new BaseClass<DerivedA>().现在,虽然我正在尝试将属性注入(inject)到我使用这些类的类中。为此,我尝试将类型作为参数(以便我可以注入(inject)正在使用的派生类)。

尽管我在寻找示例并尝试自己,但现在我还是有点不知所措。我现在想知道:这样的结构是否可以使用?如果是这样,我如何实例化该类并使用 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) {...}
}

最佳答案

您可以创建您传递的任何类型的实例:

_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("...");

如果你真的需要编译时检查,我会推荐它,你的类将需要改变。您不能仅通过对基类的引用来访问在派生类上定义的方法或属性。

关于c# - 使用类型实例化使用受限泛型的派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49646206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com