実行時に、変数のタイプがわかりません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]
コメントを追加