我知道FormatterServices.GetUninitializedObject
可以做到这一点,但xbox的核心库不包含该类。
我正在进行XNA游戏,我正努力让这项工作在那里。 Activator.CreateInstance
可用,但我需要一个默认构造函数,这很丑陋。
我想到如果没有默认构造函数,我会使用最短值并传入任何值(例如,当它需要int
和object
时,我会传入0
和null
)。
但问题是,如果构造函数与传入的对象一起工作,它可能抛出异常。我仍然可以在try catch块中编写它,也许它可以这样工作。但我真的不太可能那样做。还有其他解决方案吗?
感谢您的帮助:)
答案 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库实现您的要求。