を持っている場合は修正のコレクションを返す、私はコレクションを変更するには、静的メソッドのシリーズを持って判断しますかどうかを判断する方法があるアプリケーションの別の部分ではジェネリック型は、対応する実装
private static IEnumerable<Invoice> ResolveProxies(IEnumerable<Invoice> e) {
// do something to e
return e;
}
private static IEnumerable<Person> ResolveProxies(IEnumerable<Person> e) {
// do something to e
return e;
}
を
public static GridModel<T> ToGridModel<T>(this GridModel gridModel) {
// gridModel.Data is just IEnumerable
var collection = gridModel.Data as IEnumerable<T> ?? new List<T>();
return new GridModel<T> {
Data = EvaluateDynamicProxies(collection),
Total = gridModel.Total
};
}
private static IEnumerable<T> EvaluateProxies<T>(IEnumerable<T> collection) {
if (collection is IEnumerable<Invoice>) {
var enumeration = (collection as IEnumerable<Invoice>);
return ResolveProxies(enumeration) as IEnumerable<T>;
}
if (collection is IEnumerable<Person>) {
var enumeration = (collection as IEnumerable<Person>);
return ResolveProxies(enumeration) as IEnumerable<T>;
}
// proxy resolution isn't needed so return the unchanged collection
return collection;
}
有するそのような反復条件付きロジックは悪いコードのにおいである:それはそのタイプに変換することができ、その呼ばれるResolveProxies
メソッドを対応しているように、コレクションは、特定のタイプのものです。特定の型をマークして、対応するプロキシリゾルバメソッドがあることがわかったときに、何らかの型をマークする方法を考えるのには苦労しています。おそらくこのようなもの:
public interface IProxyResolver<out T> where T:IEnumerable<T> {
T ResolveProxies();
}
これはどうやって使うのですか?実際に私は、コンパイラを依頼する方法が必要です:
T
が一致ResolveProxies
メソッドを持っていますか?T
のプロキシを解決するクラスまたはメソッドの名前はどのようなものなので、そのインスタンスを取得して呼び出すことができますか?
プロキシをクラス自体に入れなかった理由はありますか?そのクラスは、IProxyResolverを組み込むために指定されたインターフェイスまたは抽象クラスを暗示することができますか? – Lloyd
@Lloydクラス( 'Invoice'、' Person'など)は、他のチームメンバが管理するPOCOプロジェクトの一部です。私たちはそのアプローチをとることを検討しましたが、実際にはPOCOの純度を取りません。 – Yuck
属性を使用して、IProxyResolver名前空間を反復処理し、Types/SpecificProxyResolverのKey/Valueコレクションを構築する静的クラスのリフレクションを使用して、どのIProxyResolverクラスがどのクラスを処理するかを定義する属性を使用して、レゾルバが戻る?オーバーヘッドは初期静的初期化時のみです。 – Lloyd