ローカル変数を型として使用するにはどうすればよいですか?コンパイラは「それは変数ですが、型のように使用されます」と言います

IremadzeArchil19910311

実行時に、変数のタイプがわかりません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;
}    

唯一の違いはですShellProperty<AnyType>

したがって、これを多くのif elseステートメントで記述する代わりに、リフレクションを使用して実行時にプロパティタイプを取得することにしました。

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

このコードはのPropertyType取得v1してローカル変数に割り当てますt1が、その後、私のコンパイラは次のように言います。

t1は変数ですが、型のように使用されます

したがって、t1内部に書き込むことはできませんShellProperty<>

この問題を解決する方法と、私が持っているものよりもコンパクトなコードを取得する方法を教えてください。新しいクラスを作成する必要がありますか?

デックス

あなたは非常に近かった、あなたはただへの呼び出しを逃した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が指摘したように、不要な間接参照のレイヤーをいくつか追加しました。申し訳ありませんが、OP、あなたはおそらく次のようなワンライナーが必要です:

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

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ