【问题标题】:Construct generic instance with a generic parameter and a normal parameter用泛型参数和普通参数构造泛型实例
【发布时间】:2015-05-15 07:30:32
【问题描述】:

我有以下结构,我需要通过 System.Reflection 创建它的一个实例。最大的问题是我有一个通用参数和一个非通用参数。我必须使用 System.Reflection 因为它将在 T 可以变化的循环中调用。我查看了 this ,但无法使用第二个参数(int 标记)使其工作。很抱歉,我不得不问这个基本问题。

struct pair<T>
{
    public pair(T value,int tag)
    {...}
}

所以我需要这个魔法:

 object createPair(object o,int tag)
 {
   return *somemagic*
 }

编辑:解决方案是结合第一个答案公开结构。如果结构嵌套在通用结构中,则两个答案都会引发 ArgumentException,与输入无关。很抱歉不知道嵌套的这种影响。

【问题讨论】:

  • 这闻起来像XY Problem。也许试着解释你正在尝试做什么而不是你想要做什么。
  • 认为它会太长而且不好解释。我想创建一个带有多个键的字典之类的东西,并且可以使用相同的键添加对象。它应返回与给定键匹配的对象数组。键的数量应该是可变的。由于项目限制,我不允许更改 pair 结构中的任何内容。
  • 你是说使用每个对象的 type 作为对象的 Key,还是允许任意(但允许碰撞)的 Key 对象?
  • 我说的是第二个。

标签: c# generics


【解决方案1】:

链接答案有效的原因是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);
}

【讨论】:

  • var targetType = typeof(Pair&lt;&gt;).MakeGenericType(type); 抛出 ArgumentException 因为参数的数量不匹配
  • 问题仍然存在于同一位置。
  • 根据dotnetfiddle.net/XulN1e,这段代码应该可以正常运行。如果您的来源有不同之处,请更新您的答案。
  • “提供的泛型参数的数量不等于泛型类型定义的数量。”-ArgumentException
  • 通过公开 stuct 来实现。我不知道为什么,但它确实有效。
【解决方案2】:

使用MakeGenericType 方法使输入类型通用:

object createPair(object obj,int tag) {
   Type type = typeof(Pair<>);
   Type genericType = type.MakeGenericType(obj.GetType());
   return Activator.CreateInstance(genericType, obj, tag);
}

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

【讨论】:

  • @leAthlon 你把它作为参数发送什么?
  • 请注意,由于该签名声明了params object[],它认为您正在寻找.ctor(object[]),而不是.ctor(T) - 尝试删除new object[] 并直接传递参数。另请注意,.ctor 有两个参数,Tint,您还需要传递 int。
  • @Mehrzad Chehraz createPair(typeof(string),0) 问题是在您的解决方案中,您只将 0 发送给构造函数而不是泛型变量。
  • 0 是一个 int,应该是标签。
  • 还是一样的异常。
猜你喜欢
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
相关资源
最近更新 更多