我制造了一台将饼干从一种类型转换为另一种类型的机器。

每个BiscuitTransformer都有类似DigestiveBiscuitTransformer的方法:

IBiscuit Transform(DigestiveBiscuit digestiveBiscuit)方法。

假设每个变压器的类型不同,是否可以使用公共接口将它们分组? ChocolateBiscuitTransformer

IBiscuit 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/

10-10 03:36