【发布时间】:2018-11-29 07:47:58
【问题描述】:
在运行时,我不知道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;
这段代码获取v1 的PropertyType 并将其分配给局部变量t1,但在那之后,我的编译器会这样说:
t1 是一个变量,但用作类型
所以它不允许我在ShellProperty<> 中写t1。
请告诉我如何解决这个问题以及如何获得比我现有的更紧凑的代码。我需要创建一个新班级吗?
【问题讨论】:
-
您不能以这种方式使用泛型。泛型在编译时是强类型的。
-
所以你的意思是不可能的
-
静态不是这样的。但你已经在做动态了。
-
不使用动态对象。如果您的值是一个对象(即继承自 System.Object 或更好的是您拥有的某个基类),您可以使用
object v2 = v1 as ShellProperty<t1>。 (同样,使用你自己的基类——或者更好的接口——会使它更有用。)
标签: c# reflection