インターフェイスを型として取得するジェネリック関数がありますが、ある条件では、インターフェイスに応じて新しいクラスを作成する必要があります。私はそれについて考えていて、それを解決する方法はIoCを使用することですが、IoCは少しやり過ぎのように見えるので、別の方法があることを望んでいました。
以下は、ビジターパターンを使用した試みです。
public class RepositoryManager<T> : IRepositoryManager<T> where T : class, new()
{
public T GetOrCreate(string id)
{
T item = (T)CreateNew(new T(), id);
return item;
}
}
インターフェイスの代わりにオブジェクトを取得している場合は、ビジターパターンを使用してインスタンス化するクラスを把握できますが、提供されているインターフェイスによってはこれを把握できないようです。
私が持っていた他のアイデアは、またはのようなwhere宣言を行うことができるかどうかでした。
public class RepositoryManager<T> : IRepositoryManager<T> where T : class, Iabc or Ixyz, new()
質問が明確であることを願っています:)
-マーク
返信ありがとうございます。
問題は、メソッドに多くの異なるインターフェースを割り当てることができることです。たとえば、次のようになります。
RepositoryManagerクラス:
private static IMedicament CreateNew(IMedicament emptyType, string id)
{
return new Medicament { Id = id };
}
private static IRefund CreateNew(IRefund emptyType, string id)
{
return new Refund { Id = id };
}
RepositoryManager<Iabc> abcRepository = new RepositoryManager<Iabc>();
RepositoryManager<Ixyz> xyzRepository = new RepositoryManager<Ixyz>();
Iabc abc = abcRepository.GetOrCreate("12345");
Ixyz xyz = xyzRepository.GetOrCreate("12345");
したがって、TはタイプIabcまたはIxyzのいずれかである可能性があることを通知する必要があるため、使用T item = (T)CreateNew(new T(), id);
は機能しませんが、これを行うと、次のエラーが発生します。
次のメソッドまたはプロパティ間で呼び出しがあいまいですRepositoryManager<T>.CreateNew(IMedicament, string)
。RepositoryManager<T>.CreateNew(IRefund, string)
コードを数回コピーするだけでなく、これが機能するようになればいいのですが。