当使用泛型时,如果我有一个类:
class Foo<T> where T:Cheese
{
}
然后是2个派生类
class FooDerivedBlue:Foo<BlueCheese>
{
}
class FooDerivedWhite:Foo<WhiteCheese>
{
}
其中BlueChesse
和WhiteCheese
继承自chesse
。
现在还有另一个类,它会有条件地使用FooDerivedBlue
或FooDerivedWhite
。
该类应具有类似
的属性public Foo<Cheese> Foo {get;set;}
所以我可以在运行时将它设置为我需要的FooDerivedXXX
。
执行此操作时,尝试设置Foo=new FooDerivedWhite()
编译器会抱怨,因为FooDerivedWhite
无法转换为Foo<cheese>
。
更实际的例子:
如果我有
ArticleRepository<T>
AssemblyArticleRepository:ArticleRepository<AssemblyArticle>
ProductionArticleRepository:ArticleRepository<ProductionArticle>
。ProductionArticle
和AssemblyArticle
继承自Article
。两个特定的存储库都继承自ArticleRepository,并且具有许多通用逻辑。有些部分我只需要访问他们共享的逻辑(例如添加新项或删除它),为了避免重复代码,我想实例化正确的repo并传递它。
例如,我可以有一个ArticleService,我传递一个类型并实例化正确的存储库。相反,我需要为每种文章类型提供服务。 (?? - 用我的实际知识)
在.NET中解决它的方法是什么?或者我可能面临问题/以错误的方式编写代码?
更新这里有一个具体问题的要点: https://gist.github.com/rgomez90/17ec21a1a371be6d78a53a4072938f7f
答案 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();
更复杂的解决方案可能涉及显式强制转换和类型工厂,但最简单的是最好的工作。