在运行时,我不知道变量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<>
。
请告诉我如何解决这个问题,以及如何获得比我更紧凑的代码。我需要创建一个新类吗?
答案 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);