0
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 ----------

删除了 new 关键字,正如 Nenad 所说的那样是错误的。

4

1 回答 1

0

编译将您对扩展方法Execute()的调用转换为对定义它的类的静态方法的调用。因此,当您调用Product.Feature.Execute()inside时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();
    }
}
于 2013-09-22T13:55:54.217 回答