これは動作するはずです:
public interface IBar
{
T DoBarStuff<T>() where T : class, new();
}
public class Bar : IBar
{
public T DoBarStuff<T>() where T : class, new()
{
// do bar stuff
return new T();
}
}
しかし、あなたは方法DoBarStuff
を使用するときに型を指定する必要があります:
用途:var fooStuff = _foo.DoBarStuff<FooWhatEver>().GetFooStuff(id)
あなたはそうではない場合あなたのクラス/インターフェースジェネリックを作りたいと思っています:
public interface IBar<T> where T : class, new()
{
T DoBarStuff<T>();
}
public class Bar<T> : IBar<T> where T : class, new()
{
public T DoBarStuff()
{
// do bar stuff
return new T();
}
}
用途:
IBar bar = new Bar<FooWhatEver>();
var fooStuff = _foo.DoBarStuff().GetFooStuff(id);
しかし、このすべては、インタフェースのための(デフォルトのコンストラクタを持つ)のみインスタンス化クラスは動作しません。
インターフェイスの場合は、インターフェイスとその実装の間で変換する必要があります。
簡単な方法は、辞書を使うことです(テスト目的のために、@ N_tro_Pを提案するように依存関係注入フレームワークを使用することができます。
あなたは(あなたの継承とジェネリック一部を忘れてはいけない)このようなものに終わるだろう:
public class Bar // <T> or not depending on your choice
// You can add this constraint to avoid value types (as int):
// where T : class
{
Dictionary<Type, Type> _container = new Dictionary<Type, Type>();
{
{typeof(IFoo), typeof(Foo)}
};
public T DoBarStuff() // <T> or not depending on your choice
// You can add this constraint to avoid value types (as int):
// where T : class
{
// get fooStuff
return Activator.CreateInstance(_container[typeof(T)]);
// You will get an error if T is not in the container
// or if _container[typeof(T)] is not instantiable
// or doesn't have a default constructor.
}
}
唯一の問題は、すべてのあなたのインターフェイスで辞書/容器を満たす必要があります/クラスを使用したい場合、それはかなり面倒な扱いになることがあります。 私の最初の解決方法の1つを好む方がいいでしょう。
ヒントを使用:あなたはTのインスタンスを返す必要があり、ないタイプのT自体を... – ViRuSTriNiTy
'T 'は型です。 'return T;'は 'return int;'と似ています。返す* what * int?あなたのメソッドが 'T'型のオブジェクトを作成した場合は、それを返します。何かを返すつもりがない場合は、定義に戻り値を使用せず、 'void'を使用してください。 –
これを見てください:http://stackoverflow.com/questions/731452/create-instance-of-generic-type#answer-731637 – Corporalis