2015-10-04 3 views
6

私はいくつかのコードを持っています....ローカル変数を型として使う方法は?コンパイラは「変数ですが型のように使用されています」

ランタイム環境では、どのような型がv1変数であるのかわかりません! この理由から、if else文を何度も書く必要があります!

  if (v1 is ShellProperty<int?>) 
      { 
       v2 = (v1 as ShellProperty<int?>).Value; 
      } 
      else if (v1 is ShellProperty<uint?>) 
      { 
       v2 = (v1 as ShellProperty<uint?>).Value; 
      } 
      else if (v1 is ShellProperty<string>) 
      { 
       v2 = (v1 as ShellProperty<string>).Value; 
      } 
      else if (v1 is ShellProperty<object>) 
      { 
       v2 = (v1 as ShellProperty<object>).Value; 
      }   

4回書きました!違いはわずかShellProperty <するANYTYPEである>

ので、代わりのこのを使用して行をたくさん書いて「もしelse文」私は、実行時にプロパティタイプを取得するために使用リフレクションを使用することにしました

 Type t1 = v1.GetType().GetProperty("Value").PropertyType; 
    dynamic v2 = (v1 as ShellProperty<t1>).Value; 

このコードは、PropertyTypeは一種のはV1で、割り当てうまくLOローカル変数t1のあるものを手に入れることができます。
しかし
私のコンパイラは「T1は可変であるが、タイプのように使用される」と述べていることの後にそう、それは私がShellProperty <>

内のT1を書くことはできません。この問題を解決する方法を教えてとどのようにしてください私は持っているよりもコンパクトなコードを取得するには?
新しいクラスを作成する必要はありますか?

+1

このようにジェネリックは使用できません。 Genericsはコンパイル時に強く型付けされます。 –

+0

だから、これは静的にこれが好きではないことを意味します。 – IremadzeArchil19910311

+0

すでにダイナミックに作業しています。 –

答えて

8

var type = typeof(ShellProperty<>).MakeGenericType(typeof(SomeObject)); 
var v2 = Activator.CreateInstance(type); 

参照してくださいすることができ、あなただけのMakeGenericTypeへの呼び出しを逃しました。

私はあなたのコードは次のようになりますと信じて:

Type t1 = v1.GetType().GetProperty("Value").PropertyType; 
var shellPropertyType = typeof(ShellProperty<>); 
var specificShellPropertyType = shellPropertyType.MakeGenericType(t1); 
dynamic v2 = specificShellPropertyType.GetProperty("Value").GetValue(v1, null); 

編集:@PetSerAlが指摘したように 私は不必要だった間接のいくつかの層を追加しました。申し訳ありませんが、おそらく1つのライナーが好きです:

dynamic v2 = v1.GetType().GetProperty("Value").GetValue(v1, null); 
+0

これは私が望むのとまったく同じです!ありがとうございました! – IremadzeArchil19910311

+1

これは: 'v1.GetType()。GetProperty(" Value ")。GetValue(v1、null)'不十分ですか? – PetSerAl

+0

@PetSerAlあなたは絶対に正しいです、私は非常にばかげています。私は元のコードを見て、あまりにも多くの時間を費やして、自分の答えを考えている時間が足りませんでした。私は今更新する。 – Dex

5

一般的には、それらを動的に作成する必要があります。汎用オブジェクトを作成するには

MethodInfo method = typeof(Sample).GetMethod("GenericMethod"); 
MethodInfo generic = method.MakeGenericMethod(myType); 
generic.Invoke(this, null); 

、あなたはあなたが非常に接近していたInitializing a Generic variable from a C# Type Variable

関連する問題