2

我目前正在尝试学习反射,并且已经看到了一些使用 GetConstructor 的示例,我想这是我需要了解的基本功能之一,以便能够开始使用反射。我认为我了解代码的作用以及我将如何使用它。

来自 msdn 的代码示例

http://msdn.microsoft.com/en-us/library/h93ya84h.aspx

types[0] = typeof(int);
// Get the constructor that takes an integer as a parameter.
ConstructorInfo constructorInfoObj = myType.GetConstructor(types);

我对代码的唯一问题是我不明白为什么我需要创建一个虚拟类型数组才能使用 GetConstructor 方法(“方法是以这种方式构造的”除外)。在我看来,逻辑参数将是一个整数,其中包含我试图通过反射获得的构造函数的索引。如果存在原因,有人可以解释为什么将类型数组用作参数吗?

4

4 回答 4

4

通过签名搜索构造函数,即通过参数类型的有序列表。这就是为什么你需要传递一个构造函数参数类型的数组。在我看来,这是非常合乎逻辑的。

于 2013-03-18T17:01:02.840 回答
2

它需要一个带有特定签名的Type[]搜索。constructor

array represent the order of Parameter接受的类型Constructor

根据 MSDN 上给出的示例

public class MyClass1
  {
      public MyClass1(){}
      public MyClass1(int i){}
  }

如果你通过了类似的东西

Type[] types = new Type[1];
types[0] = typeof (long);

ConstructorInfo constructorInfo = typeof (MyClass1).GetConstructor(types);

constructorInfo本来是null,因为不constructor存在以long作为论据的存在

于 2013-03-18T17:01:59.570 回答
1

因为构造函数可以有零个或多个参数。类型列表告诉反射要获取哪个构造函数。

于 2013-03-18T17:01:33.023 回答
1

[..] 我不明白为什么我需要创建一个虚拟类型数组才能使用 GetConstructor 方法(“方法是以这种方式构造的”除外)

通常,反射可以解决诸如“从已知具有构造函数的类型创建对象,该构造函数接受一个 int,然后是 string,然后是 double”。考虑到这一点,提供一组参数类型作为输入是有意义的。由于您正在从可能有多个类型的类型中寻找单个构造函数,您还希望如何消除歧义?

在我看来,逻辑 in 参数将是一个整数,其中包含我试图通过反射获得的构造函数的索引。

您希望该指数代表什么?不保证反射 API 以与在源编程语言中声明的顺序相同的顺序对成员进行排序。无论如何,看起来您想要一个可以枚举/索引的构造函数数组。Type.GetConstructors将对此有所帮助。

于 2013-03-18T17:04:28.947 回答