gpt4 book ai didi

c# - 从其通用基类引用特定类

转载 作者:太空宇宙 更新时间:2023-11-03 14:54:16 24 4
gpt4 key购买 nike

在使用泛型时,如果我有一个类:

class Foo<T> where T:Cheese
{
}

然后是2个派生类

class FooDerivedBlue:Foo<BlueCheese>
{
}

class FooDerivedWhite:Foo<WhiteCheese>
{
}

哪里BlueChesseWhiteCheese继承自 chesse .

现在有另一个类,它将有条件地使用 FooDerivedBlueFooDerivedWhite .

这个类应该有一个类似

的属性
public Foo<Cheese> Foo {get;set;}

所以我可以将它设置为 FooDerivedXXX我需要在运行时。

执行此操作时尝试设置 Foo=new FooDerivedWhite()编译器会提示,因为 FooDerivedWhite无法转换为 Foo<cheese> .

一个更实际的例子:

如果我有一个

  • ArticleRepository<T>
  • AssemblyArticleRepository:ArticleRepository<AssemblyArticle>
  • ProductionArticleRepository:ArticleRepository<ProductionArticle> .
  • ProductionArticleAssemblyArticle继承自 Article .

具体的两个repository都继承自ArticleRepository,有很多共同的逻辑。有些部分我只需要访问它们共享的逻辑(例如添加新项目或删除它)并且为了避免重复代码,我想实例化适当的 repo 并传递它。

例如,我可以有一个 ArticleService,我传递一个类型并实例化正确的存储库。相反,我需要为每种文章类型提供服务。 (??-据我所知)

在.NET中有什么方法可以解决?或者,也许我正面临问题/以错误的方式编写我的代码?

更新 这里有一个具体问题的要点: https://gist.github.com/rgomez90/17ec21a1a371be6d78a53a4072938f7f

最佳答案

有几种方法可以解决这个问题,但最直接的可能是让您的“其他类”也有一个通用类型参数来描述它在哪种奶酪上运行。那么所有的类型都可以是静态正确的。

public abstract class Cheese { }

public class BlueCheese : Cheese { }

public abstract class CheeseTool<T> where T:Cheese { }

public class BlueCheeseTool : CheeseTool<BlueCheese> { }

public class CheeseEater<T> where T : Cheese {
public T Cheese;
public CheeseTool<T> Tool;
}

那么所有的输入都是静态正确的:

CheeseEater<BlueCheese> eater = new CheeseEater<BlueCheese>();
eater.Cheese = new BlueCheese();
eater.Tool = new BlueCheeseTool();

更复杂的解决方案可能涉及显式转换和类型工厂,但如果能完成工作,最简单的就是最好的。

关于c# - 从其通用基类引用特定类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50429518/

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