加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 07:47:08 所属栏目:百科 来源:网络整理
导读:我正在使用通用工厂类,其中通用部分是正在使用的派生类.正常用法很明确:BaseClass DerivedA C = new BaseClass DerivedA().现在虽然我试图将属性注入到我使用这些类的类中.为此,我尝试将Type作为参数(这样我可以注入正在使用的派生类). 虽然我有点不知所措,
我正在使用通用工厂类,其中通用部分是正在使用的派生类.正常用法很明确: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) {...}
}

解决方法

您可以使用以下方法创建任何类型的实例:
_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("...");

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读