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

新しいキーワードを削除しました。ネナドが言ったように間違っていました。

4

1 に答える 1

0

コンパイルは、拡張メソッドへのExecute()呼び出しを、それが定義されているクラスの静的メソッドへの呼び出しとして変換します。そのため、Product.Feature.Execute()内部で を呼び出す場合、適切な拡張メソッドを呼び出すためにDoProcess()、コンパイラは の型を知る必要があります。Product.Feature

私が提案するのはIHasFeature、このように書くことです

public interface IHasFeature
{
    void DoSomethingWithFeature();
}

汎用性を維持したい場合は、指定せずIHasFeatureに定義して で実装するのが最善です。BaseContainerTFeatureDoProcess()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 に答える