从其通用基类引用特定类

时间:2018-05-19 21:10:33

标签: c#

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

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

两个特定的存储库都继承自ArticleRepository,并且具有许多通用逻辑。有些部分我只需要访问他们共享的逻辑(例如添加新项或删除它),为了避免重复代码,我想实例化正确的repo并传递它。

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

在.NET中解决它的方法是什么?或者我可能面临问题/以错误的方式编写代码?

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

1 个答案:

答案 0 :(得分:0)

有几种方法可以解决这个问题,但最简单的方法可能就是让你的其他班级#34;还有一个通用的类型参数,描述它运行的奶酪类型。然后所有类型都可以是静态正确的。

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();

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