使用泛型参数和普通参数

时间:2015-05-14 19:46:17

标签: c# generics

我有以下结构,我需要通过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,与输入无关。我很遗憾不知道这种嵌套的影响。

2 个答案:

答案 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);
}

但如果可能的话,我会使用泛型而不是反射。