c#反射:创建一个没有默认构造函数的对象实例

本文关键字:默认 构造函数 实例 对象 一个 反射 创建 | 更新日期: 2023-09-27 18:05:22

我知道FormatterServices.GetUninitializedObject可以这样做,但是xbox的核心库不包含这个类。

我正在制作一款XNA游戏,我正尝试着让它在那里发挥作用。Activator.CreateInstance是可用的,但我需要一个默认构造函数,这是多么丑陋。

我想到如果没有默认构造函数,我取最短的并传递任何值(例如,当它需要intobject时,我传递0null)。但问题是,如果构造函数处理传入的对象,则可能抛出异常。我仍然可以把它写在try - catch块中,也许它是这样工作的。但我真的不太可能那样做。还有其他解决办法吗?

谢谢你的帮助

c#反射:创建一个没有默认构造函数的对象实例

你不需要默认构造函数,我认为有一个重载,你可以在

中传递参数
Activator.CreateInstance (typeof (Foo), new object []{  args});

也就是说,你也可以使用反射来获取构造函数并调用它。

编辑:等等——重读问题,你是说你不知道该传递什么?那你为什么要创造它?

不,这是完全错误的解决方案。

肯定需要一个默认构造函数,否则你没有必要这样构造对象。

请注意,可以使用"非默认"构造函数(这里的"默认"是指"无参数"),但您仍然应该传入所需的参数,不仅按类型,而且按含义。

由于您使用的是Activator.CreateInstance,我假设您除了Type对象之外对所讨论的类型了解不多。在这种(一般)情况下,您不应该仅仅将一些奇数值传递给构造函数,希望它对所讨论的类型有意义。

另一方面,如果你有某种契约,你可以说"我知道这种类型支持契约X",你可能会考虑使用一个接口,并在构造对象后调用该接口上的方法。接口将有一个已知的方法(需要构造实例的代码知道),您将使用已知的(已知的是知道有多少,它们的类型,以及它们的含义)参数调用该方法。

只是随机地(传递0和null只是为了满足签名,就像传递42和一些奇数对象一样随意)将参数传递给构造函数根本不安全

接口示例:

object instance = Activator.CreateInstance(someTypeObject);
((ISomeInterface)instance).Initialize(your, specific, parameters, here);

你可能需要的是一个IoC框架,这样你就可以说"每当有人需要这个类的实例时,这是如何构造它的"。

查找:

    控制反转(IOC) - Wikipedia
  • Autofac
  • Ninject
  • 统一
  • 温莎城堡
  • 有更多,搜索控制反转c#

您声明您的目标类没有默认(或"无参数")构造函数。换句话说;类的构造函数包含"依赖项"。在满足这些依赖关系之前,它不能(也不应该!)被构造。

你需要的是一个依赖注入(或控制反转)容器。我推荐你看看Ninject,因为它的实现恰好与XNA兼容。

依赖注入框架允许你指定一般的"规则",这样当你遇到需要在构造函数中使用参数的对象时,DI容器就可以"填补空白"。例如,创建Foo类型的DI规则示例:"当你试图创建一个Foo类型的对象,它有一个带参数(int, object)的构造函数时,将这些值传递给构造函数:(0,null)。"

花一点时间浏览一下所提供的链接中的一些示例,以了解如何使用Ninject库实现您所要求的内容。