gpt4 book ai didi

c# - C#泛型类中的协变

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

C# 4.0 .NET 4.5 银光 5我找不到解决方案似乎很奇怪,所以需要一些帮助。

我有基类 Base 和派生类 Child : Base。我还有一个帮助器类,它具有泛型类型来完成特定的工作,一个 EF 实体帮助器,其中 T:EntityObject。

child 使用特定实体 MyEntity 执行特定工作:EntityObject。

所以我尝试了:

public class Base
{
protected Helper<EntityObject> helper;
}
public class Child : Base
{
public Child()
{
helper = new Helper<MyEntity>();
}
}

我希望更多的派生类必须了解更具体的泛型参数,我认为这就是协变的原因……但这不起作用……

像这样设计类的“正确”方法是什么?

编辑:抱歉,我没有 100% 清楚为什么我不能实现我需要的。

一个。使用通用 Base 的解决方案不起作用,因为 Base 的用户不知道 T 类型。想象一下:

public class User
{
private Base<T> base; // this will not compile.
public User(TypeEnum t)
{
if(t == TypeEnum.MyEntity) base = new Child();
...

b。 Interface 的解决方案不起作用,因为 helper 在任何地方都使用 T(这是它的目的,对吗?)。想象一下它有方法

public IEnumerable<T> Process(IEnumerable<T> items) { return items; }

如何在对T一无所知的界面中调出它

最佳答案

我认为这就是您所追求的:

public class Base<T> where T : EntityObject
{
protected Helper<T> helper;
}
public class Child : Base<MyEntity>
{
public Child()
{
helper = new Helper<MyEntity>();
}
}

编辑(响应您的编辑):您可以添加一个Base,像这样使用:

public class Base
{
// put anything here that doesn't rely on the type of T
// if you need things here that would rely on T, use EntityObject and have
// your subclasses provide new implementations using the more specific type
}
public class Base<T> : Base where T : EntityObject
{
protected Helper<T> helper;
}
public class Child : Base<MyEntity>
{
public Child()
{
helper = new Helper<MyEntity>();
}
}
public class User
{
private Base myBase;
public User(TypeEnum t)
{
if(t == TypeEnum.MyEntity) myBase = new Child();
...

关于c# - C#泛型类中的协变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16317541/

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