如何使用局部变量作为类型?编译器说"它是一个变量但是被用作类型"

时间:2015-10-04 15:45:45

标签: c# reflection

在运行时,我不知道变量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的{​​{1}}并将其分配给局部变量t1,但在此之后,我的编译器会说:

  

t1是一个变量,但类似于

所以它不允许我在t1内写ShellProperty<>

请告诉我如何解决这个问题,以及如何获得比我更紧凑的代码。我需要创建一个新类吗?

2 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:8)

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

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);

请参阅Initializing a Generic variable from a C# Type Variable