Reflection C#:创建一个没有默认构造函数的对象实例

时间:2013-03-23 16:28:22

标签: c# object reflection xna

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

我正在进行XNA游戏,我正努力让这项工作在那里。 Activator.CreateInstance可用,但我需要一个默认构造函数,这很丑陋。

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

感谢您的帮助:)

3 个答案:

答案 0 :(得分:4)

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

肯定需要一个默认的构造函数,否则你就没有这种方式构建对象的业务。

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

由于您使用的是Activator.CreateInstance,我假设您对相关类型了解不多,除了Type对象。在这个(一般)情况下,你不应该只是将一些奇怪的值传递给构造函数,希望它对有问题的类型有意义。

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

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

接口示例:

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

你可能需要的是一个IoC框架,所以你可以说“每当有人需要这个类的实例时,这里就是如何构建它”。

向上看:

答案 1 :(得分:4)

你不需要默认构造函数,我认为你可以在

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

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

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

答案 2 :(得分:0)

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

您需要的是Dependency Injection(或Inversion of Control)容器。我推荐looking at Ninject,以获得与XNA兼容的出色实现。

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

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