2011-06-23 9 views
0

私はそうのように定義された工場があります。MYELEMENTはIReportElementを実装する型にインスタンス化されると仮定すると、タイプをGeneric Factoryに動的に渡す方法は?

IReportElement MyElement { get; set; } 

、どのように:私はこのような変数を持って、このメソッドを呼び出すクラスで

public IPopulator CreatePopulator<T>(ReportItem Item) where T : IReportElement 
    { 
     if (typeof(T) == typeof(BarChartElement)) 
     { 
      return BarChartPopulator.Create(Item); 
     } 
     else 
     { 
      throw new NotSupportedException(string.Format("Type: {0} is not suppported by {1}", typeof(T).Name, this.GetType().Name)); 
     } 
    } 

をこの変数を使用して私の工場に電話することはできますか?

私は、switch文を書くことができますが、私は私のタイプに合格するためのいくつかの方法があるはずのように私は感じ

Type VariableType = MyChartElement.GetType(); 
PopulatorFactory.CreatePopulator<VariableType>(new Chart()); 

そして

PopulatorFactory.CreatePopulator<MyVariable.GetType()>(new Chart()); 

を試してみました。これは可能ですか?

+0

リフレクションで可能です。あなたの場合、これはオプションですか? –

+0

反射がオプションです。 – BentOnCoding

+1

これは[Reflectionを使用してGeneric Methodを呼び出す方法]の複製です(http://stackoverflow.com/questions/232535/how-to-use-reflection-to-call-generic-method)。 –

答えて

3

変数をそのような一般的な引数として使用することはできません。型の安全性を提供できる唯一の方法は、タイプがのコンパイル時にに知られている場合です。

あなたが説明したように、ファクトリメソッドはswitch文として実装される傾向があり、本質的にそれには間違いはありません。ファクトリメソッドに列挙型を渡すことができます。ファクトリメソッドは、IReportElementを実装する型のインスタンスを返します。

とにかくここで成し遂げようとしているものが得られません。ジェネリックファクトリメソッドは、引数の型をチェックしています。タイプをチェックしなければならない場合は、それはもはや一般的なものではないので、何がポイントですか?

おそらく、あなたはこのコードで実際にどのような問題を解決しようとしているのかについてもう少し詳しく知ることができます。まだ検討していないより良い選択肢があるかもしれません。

+0

私は、目的のためにコードを単純化しました。これは、実際のファクトリの実装がはるかに大きなものではありません。 switch文とif文は、重要でない実装の詳細です。変数の型を取得するためにリフレクションを使用することについて、あなたはどう思いますか? – BentOnCoding

+0

私はそれが最後の手段であるべきだと言います。それがより簡単に成し遂げられるならば、安全で、より効率的な方法をタイプするべきです。 –

+0

それは重要ではありません。私がリファクタリングするとき、私はDRY原則を限界まで取る。 – BentOnCoding

2

@Dan Bryantのように変更できないライブラリで作業している場合は、このようなことをする必要があります。

typeof (PopulatorFactory) 
    .GetMethod("CreatePopulator") 
    .GetGenericMethodDefinition() 
    .MakeGenericMethod(new[] {myVariable.GetType()}) 
    .Invoke(null, new object []{new Chart()}); 
関連する問題