Get____Factory
アプリケーションにいくつかのメソッドがあり、それらをジェネリックで統合したいのですが、まだC#を調整しており、a)ジェネリックが正しい方法であるかどうか100%確信が持てず、b)C#がジェネリックを処理する方法をまだ学習しています。
最終的には、ファクトリインターフェイスとそのクラスの辞書/マップを作成します。すべてのファクトリを簡単にアクセスできる方法に統合したいだけでなく、プラグインの作成者が自分のファクトリを登録する方法を許可する必要があります(そしてこの方法でそれらにアクセスできます)。
私はこのようなものから始めました:
注:最終的には、インターフェースタイプをそれらの実装にマップする辞書または方法があります-if / else条件は醜く一時的ですが、単にテストする方法です。
public T GetFactory<T>() where T : IFactory {
var t = typeof(T);
if (t.Equals(typeof(IRecipeFactory))) {
var factory = new RecipeFactory();
return factory;
}
else if (t.Equals(typeof(IItemFactory))) {
var factory = new ItemFactory();
return factory;
}
else if (t.Equals(typeof(ITileFactory))) {
var factory = new TileFactory();
return factory;
}
}
で失敗するCannot implicitly convert type 'RecipeFactory' to 'T'
ため、これは機能しません。長期的には、条件文はありませんが、クラスをそのタイプで検索します。ただし、キャストの問題の解決策が見つかるまで、どちらも機能しません。
他の回答に基づいて、ダブルキャスティング((T) (object)
)を試しましたが、InvalidCastException: Cannot cast from source type to destination type.
。でエラーが発生しました。
これは貧弱なアーキテクチャであるか、ジェネリックを誤って使用しています。
T
メソッドがを返すので、途中でオブジェクトをキャストする必要がありますT
。このキャストを行うにはfactory
、IFactory
public T GetFactory<T>() where T : IFactory
{
var t = typeof(T);
if (t.Equals(typeof(IRecipeFactory)))
{
IFactory factory = new RecipeFactory();
return (T)factory;
}
if (t.Equals(typeof(IItemFactory)))
{
IFactory factory = new ItemFactory();
return (T)factory;
}
if (t.Equals(typeof(ITileFactory)))
{
IFactory factory = new TileFactory();
return (T)factory;
}
throw new InvalidOperationException("Type not supported");
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加