我制造了一台将饼干从一种类型转换为另一种类型的机器。
每个BiscuitTransformer都有类似DigestiveBiscuitTransformer的方法:IBiscuit Transform(DigestiveBiscuit digestiveBiscuit)
方法。
假设每个变压器的类型不同,是否可以使用公共接口将它们分组? ChocolateBiscuitTransformerIBiscuit Transform(ChocolateBiscuit chocolateBiscuit)
GingerNutBiscuitTransformer:IBiscuit Transform(GingerNutBiscuit gingerNutBiscuit)
理想情况下,我想要实现的是一个BiscuitTransformationManager,它将接收任何类型的饼干,并为您提供IBiscuit。
它将所有变压器加载到List<IBiscuitTransformer>
中,然后IBiscuitTransformer也将公开Type InputBiscuitType {get;}
,因此您可以将其与传入的饼干类型进行比较:
BiscuitTransformationManager:
IBiscuit Transform<T>(T biscuit)
{
var transformer = LoadTransformers().Single(c => c.InputBiscuitType == typeof(T));
return transformer.Transform(biscuit);
}
我认为这行不通,因为“变形金刚”会期待一种具体的类型,而不是T。
问题是我无法弄清楚如何对它们进行分组,并且如果我将接口方法设为
Transform<T>
,则不确定如何实现,因为T在DigestiveBiscuit
中始终是DigestiveBiscuitTransformer
,但是代码会接受任何东西,这没有任何意义。有任何想法吗?
最佳答案
我认为这里不需要泛型。
简单地说:
IBiscuit Transform(IBiscuit biscuit)
{
var transformer = LoadTransformers().Single(c => c.InputBiscuitType == biscuit.GetType());
return transformer.Transform(biscuit);
}
但是,当然,这意味着每个转换器都应具有匹配的方法签名,而不是特定于类型的,我认为这实际上是正确的方法。
所以代替
IBiscuit Transform(DigestiveBiscuit digestiveBiscuit)
将该变压器的签名(以及其他签名)更改为:
IBiscuit Transform(IBiscuit digestiveBiscuit)
我认为这种设计比尝试使其与泛型一起使用更干净,更简单。
关于c# - 您可以将通用对象分组到一个列表中吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30648312/