我知道FormatterServices.GetUninitializedObject
可以这样做,但是xbox的核心库不包含这个类。
我正在制作一款XNA游戏,我正尝试着让它在那里发挥作用。Activator.CreateInstance
是可用的,但我需要一个默认构造函数,这是多么丑陋。
我想到如果没有默认构造函数,我取最短的并传递任何值(例如,当它需要int
和object
时,我传递0
和null
)。但问题是,如果构造函数处理传入的对象,则可能抛出异常。我仍然可以把它写在try - catch块中,也许它是这样工作的。但我真的不太可能那样做。还有其他解决办法吗?
谢谢你的帮助
你不需要默认构造函数,我认为有一个重载,你可以在
中传递参数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库实现您所要求的内容。