如何简化此嵌套泛型类型

时间:2013-09-22 11:37:13

标签: c# generics

public interface IHasFeature<TFeature> { 
    TFeature Feature { get; set; } 
}
public class FeatureOne { 
    /*...*/ 
}
public class ProductOne : IHasFeature<FeatureOne> { 
    public FeatureOne Feature { get; set; } 
}
public abstract class BaseContainer<TProduct, TFeature> 
where TProduct : IHasFeature<TFeature> {
    public TProduct Product { get; set; }
    public void DoProcess() { 
        var result = Product.Feature.Execute(); //Execute is an extension method
    } 
}
public class MyContainer : BaseContainer<ProductOne, FeatureOne> { 
    /*...*/ 
} 

我的工作

MyContainer : BaseContainer<ProductOne, FeatureOne>

但我想

MyContainer : BaseContainer<ProductOne>

ProductOne : IHasFeature<...>应该已经包含嵌套的通用功能TFeature,我不想在MyContainer构造中再次重复它们。

知道如何改善这个吗?感谢。

EDIT2 -----------------------

删除了新关键字,Nenad说这是错误的。

1 个答案:

答案 0 :(得分:0)

编译将您对扩展方法Execute()的调用转换为对定义它的类的静态方法的调用。因此,当您在Product.Feature.Execute()内调用DoProcess()时,编译器需要知道Product.Feature的类型才能调用相应的扩展方法。

我建议写这样的IHasFeature

public interface IHasFeature
{
    void DoSomethingWithFeature();
}

如果您想保持IHasFeature通用,那么您可以做的最好的事情是定义BaseContainer而不指定TFeature并在DoProcess()中实施MyContainer

public abstract class BaseContainer<TProduct>
{
    public TProduct Product { get; set; }
    public abstract void DoProcess();
}

public class MyContainer : BaseContainer<ProductOne>
{
    public override void DoProcess()
    {
        Product.Feature.Execute();
    }
}