gpt4 book ai didi

c# - 可以在 中传递父类(super class)的子类吗?

转载 作者:行者123 更新时间:2023-11-30 16:25:40 25 4
gpt4 key购买 nike

我有一个名为 GenericDao 的类

internal class GenericDao<T> : IGenericDao<T> {
}

二类对象:

public class Empresa {
}

public class Assessoria : Empresa {
}

我有一个 EmpresaDao:

public class EmpresaDao {

private GenericDao<Empresa> parent { get; set; }

public EmpresaDao() {
this.parent = new GenericDao<Empresa>();
}
}

如何使用子类Assessoria实例化GenericDao?我做了这样的事情,但没有工作:

public class EmpresaDao {

private GenericDao<Empresa> parent { get; set; }

public EmpresaDao(Type type) {
if (type == typeof(Assessoria)) {
this.parent = new GenericDao<Assessoria>();
} else {
this.parent = new GenericDao<Empresa>();
}
}
}

最佳答案

简而言之,你不能,真的。但是,如果您使用非泛型的基接口(interface),或者您使用 C# 4 并使用泛型的基接口(interface),但具有协变或逆变(取决于需要)类型参数,则可以稍微作弊。对于第一种情况:

interface IGenericDaoBase {
}

interface IGenericDao<T> : IGenericDaoBase {
}

public class EmpresaDao {
private IGenericDaoBase parent { get; set; }
public EmpresaDao(Type type) {
// same as before
}
}

诚然,重新考虑您的设计可能会更好。也许 EmpresaDao 本身可以采用通用参数,可以像这样使用:

public class EmpresaDao<T> where T : Empresa {
private GenericDao<T> parent { get; set; }
public EmpresaDao() {
this.parent = new GenericDao<T>();
}
}

编辑:事实上,我想得越多,我就越相信后一种解决方案是可行的方法。构造函数中的类型参数与类签名中的类型参数起着相同的作用。因此,除了传入通用参数而不是 Type 对象外,您不必对调用代码进行太多更改。

关于c# - 可以在 <T> 中传递父类(super class)的子类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9637961/

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