2

我知道FormatterServices.GetUninitializedObject可以做到这一点,但 xbox 的核心库不包含该类。

我正在开发一款 XNA 游戏,我正试图在那里完成这项工作。Activator.CreateInstance是可用的,但我需要一个默认构造函数,这很丑陋。

我想如果没有默认构造函数,我取最短并传入任何值(例如,当它需要 anint和 an时object,我传入0and null)。但问题在于,如果构造函数与传入的对象一起工作,它可能会抛出异常。好吧,我仍然可以将它写在 try catch 块中,也许它可以这样工作。但我真的不太可能这样做。还有其他解决方案吗?

谢谢你的帮助 :)

4

3 回答 3

4

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

肯定需要一个默认构造函数,否则您将无法以这种方式构造对象。

请注意,您可以使用“非默认”(我在这里将“默认”作为“无参数”的意思)构造函数,但您仍然应该传递所需的参数,不仅仅是按类型,还应按含义传递。

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

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

只是随机地(传入 0 并且null只是为了满足签名与传入 42 和一些奇怪的对象一样任意)将参数传递给构造函数根本不安全

接口示例:

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

您可能需要一个 IoC 框架,这样您就可以说“每当有人需要此类的实例时,以下是构建它的方法”。

抬头:

于 2013-03-23T16:36:36.323 回答
4

不需要默认构造函数,我认为您可以在其中传递参数的重载

Activator.CreateInstance (typeof (Foo), new object []{  args});

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

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

于 2013-03-23T16:37:59.030 回答
0

您声明您的目标类没有默认(或“无参数”)构造函数。换一种方式; 您的类的构造函数包含“依赖项”。在满足这些依赖关系之前,它不能(也不应该!)构建。

您需要的是一个依赖注入(或控制反转)容器。我建议查看 Ninject,以获得恰好与 XNA 兼容的出色实现。

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

花一点时间浏览提供的链接上的一些示例,了解如何使用 Ninject 库来实现您的要求。

于 2013-03-23T16:33:07.047 回答