我有以下结构,我需要通过System.Reflection创建它的实例。最大的问题是我有一个泛型参数和一个非泛型参数。我必须使用System.Reflection,因为它将在一个T可以变化的循环中调用。我查看了this,但我无法使用第二个参数(int标记)。对不起,我不得不问这个基本问题。
struct pair<T>
{
public pair(T value,int tag)
{...}
}
所以我需要这个魔术:
object createPair(object o,int tag)
{
return *somemagic*
}
编辑:解决方案是将结构公开与第一个答案结合使用。如果struct嵌套在泛型结构中,则两个答案都会抛出ArgumentException,与输入无关。我很遗憾不知道这种嵌套的影响。
答案 0 :(得分:3)
链接的答案有效的原因是因为Activator.CreateInstance
的重载挂钩到无参数的公共构造函数,也称为默认构造函数。
但是,同样的方法有overloads,其中包含接受参数的signature。
public object CreatePair(object t, int tag)
{
var type = t.GetType();
var targetType = typeof(Pair<>).MakeGenericType(type);
return Activator.CreateInstance(targetType, t, tag);
}
答案 1 :(得分:2)
使用MakeGenericType方法输入输入类型:
object createPair(object obj,int tag) {
Type type = typeof(Pair<>);
Type genericType = type.MakeGenericType(obj.GetType());
return Activator.CreateInstance(genericType, obj, tag);
}
但如果可能的话,我会使用泛型而不是反射。