2016-06-29 4 views
1

は、私は、一般的な方法があります:Tタイプを返すには?

private ILogger _logger; //get logger something else. 
public T GetService<T>(ServiceType type) 
{ 
//how to return _logger? 
} 

どのように私はTを返すことができますか?

var logger=GetService<ILogger>(log); 

のgetServiceメソッドを実装する方法: はたとえば、私はILoggerですがありますか? ありがとうございました!

P.S.はい、私はGetServiceメソッドから1つ以上の型を取得しようとします。 例:Logger、その他のインフラストラクチャクラス。 私は、ServiceLocatorが正しい選択ではないことを知っています(多くの場所で使用されています)が、私の方法では(GetServiceは1つの場所で使用されます:私のプラグインのインフラストラクチャを取得するために)

+0

HI @Admiral、多分あなたは[この]を参照することができます(http://stackoverflow.com/questions/9808035/how-do-i-make-the-return-type-をof-a-method-generic) –

+0

私は間違いなくここで反射を使用しません。 @HimBromBeereは全く必要ありません –

+1

'ILogger'と' T'は共通しているものは何ですか? – HimBromBeere

答えて

1

Tが​​を実装していることを確認します。これは無効なキャストを引き起こす可能性があること

public T GetService<T>(ServiceType type) where T : ILogger 
{ 
    return (T)_logger; 
} 

注:その後、あなたはTにインスタンスをキャストする必要があります。この上の例外を防ぐため、代わりにnullを返すには、asを使用することができます。

public T GetService<T>(ServiceType type) where T : ILogger 
{ 
    return _logger as T; 
} 
0

はこれを試してみてください。

private ILogger _logger; //get logger something else. 
public T GetService<T>(ServiceType type) 
{ 
// codes here... 
return (T)(object) _logger; 
} 
+0

なぜオブジェクトにキャストするのですか?可能な限りキャストの問題を回避するのではなく、キャスティングの問題を回避するほうがよいでしょうか? –

-1

あなたがnew()としてTを宣言する必要があり、それは、パラメータなしのコンストラクタを持たなければなりません。そして、あなたは、単にインスタンスを作成し、それを返すことができます。

public T GetService<T>(ServiceType type) where T : new() 
    { 
     T t = new T(); 
     return t; 
    } 

さて、代わりにあなたが他の人を使用することができnew T()の、あなたは工場のいくつかの並べ替えを作成しようとしているようなあなたのServiceType ..

+3

OPが尋ねるように、あなたは '_logger'を返しません。あなたは 'T'の新しいインスタンスを返します。 –

+0

これは、ILoggerなどのタイプのTを返すことです。 –

+2

いいえ、コード内のコメントとして: '//どのように_loggerを返しますか? ' – HimBromBeere

2

かもしれですねメソッドに基づいています。おそらくこれは役立つかもしれない:

public class Factory 
{ 
    private ILogger _logger; //get logger something else. 

    public Factory() 
    { 
     _factories = new Dictionary<Type, Func<Type, object>>() 
     { 
      { typeof(ILogger), t => _logger }, 
     }; 
    } 

    private Dictionary<Type, Func<Type, object>> _factories; 

    public T GetService<T>() 
    { 
     var t = typeof(T); 
     return (T)_factories[t].Invoke(t); 
    } 
} 
関連する問題