如何使用局部变量作为类型? 编译器说“它是一个变量但是像一个类型一样使用”

我有一些代码……

在运行时环境中,我们不知道v1变量是什么类型的! 出于这个原因,我们应该多次写“if else”语句!

if (v1 is ShellProperty) { v2 = (v1 as ShellProperty).Value; } else if (v1 is ShellProperty) { v2 = (v1 as ShellProperty).Value; } else if (v1 is ShellProperty) { v2 = (v1 as ShellProperty).Value; } else if (v1 is ShellProperty) { v2 = (v1 as ShellProperty).Value; } 

我写了4次! 区别仅在于ShellProperty

所以不要使用“if else statement”写出很多行
我决定使用reflection来获取运行时的属性类型!

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

这段代码可以得到什么样的PropertyType是v1,并且分配很好地局部变量t1。
但之后我的编译器说“t1是一个变量但是像一个类型一样使用”
所以它不允许我在ShellProperty 中写入t1

请告诉我如何解决这个问题以及如何获得比我更紧凑的代码?
是否有必要创建新课程?

你非常接近,你只是错过了对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); 

对于generics,您必须动态创建它们。

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

要创建通用对象,您可以

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

请参阅从C#类型变量初始化通用变量