IEnumerableにいくつかのデータオブジェクトがあります。データオブジェクトは様々なタイプのものがあります。それらを呼ぶことにしましょう:私はちょうどBaseData上で実行することができる方法に加えてAデータとなBData特定の機能を提供するために、ラッパークラスを作成する必要がジェネリックなファクトリメソッドジェネリック型を返す
IEnumerable<BaseData>
BaseData can be:
AData:BaseData
BData:BaseData
。
私はAデータと、なBDataとBaseDataの構造をミラーリング.....
AWrapper:BaseWrapper and
BWrapper:BaseWrapper
BaseWrapperクラスを実装することによってこの問題を解決することを決めました。 BaseWrapperを宣言
は非常に簡単です:
VAR wrappedEnumerable = EnumerableBaseData.Select(DT:しかし、どのように私は自分のライブラリの消費者がこれを書くことができるように、静的ファクトリメソッドを作成するのです
public abstract class BaseWrapper<T> where T:BaseData
{
protected T inner;
// Additional methods consuming "inner" as BaseData.
}
public class AWrapper : BaseWrapper<AData>
{
//Consuming "inner" variable here strongly typed as AData
}
public class BWrapper : BaseWrapper<BData>
{
//Consuming "inner" variable here strongly typed as BData
}
=> BaseData.Create(dt));
私はこれを行うことができると思っているだろう:
public static BaseWrapper Create(BaseData inner)
{
if (inner is AData adata)
{
return new AWrapper(adata);
}
if (inner is BData bdata)
{
return new BWrapper(bdata);
}
// And so on....
}
しかしの戻り値の型は、メソッドを作成しますが、一般的なパラメータが求められています。 メソッドのコンシューマは、typeパラメータを指定する必要はありません。 (Tの)BaseWrapperの基本クラスである非持続的なBaseWrapperクラスは、BaseDataオブジェクトへのアクセスなしで機能を持たないため、実際には意味をなさない。
することができます(あなたはもちろん、立ち往生している時点まで)コンパイル少なくとも郵便番号。たとえば、 'WrapperBase'とは何ですか? – DavidG
「WrapperBase」タイプは突然どこから出現しましたか? 'BaseWrapper'と打つのですか? –
@MatthewWatsonはい、タイプミスです。私はBaseWrapperを意味しました。 – Tormod