0

我在我的游戏中使用自定义属性来允许我定义聚合组件之间的依赖关系。在自定义属性中使用'新SomeObject'

[ComponentDependency(typeof(SomeDependentComponent))]
class SomeComponent : Component {}

但是,这意味着我必须使用默认值,我想补充这样每个组件。我希望能够做到:

[ComponentDependency(typeof(SomeDependentComponent), ctrParam1, ctrParam2...)]

,并直接喂到这些Activator.CreateInstance(Type, object[]),但我得到的错误。我认为这是关于编译时的属性。我对他们了解不多。

这可能吗?

编辑:如果我使用的参数,它可能看起来像: [ComponentDependency(typeof(PositionalComponent), new Vector2(300, 300))]

+0

参数是什么? – SLaks 2011-06-14 15:22:33

+0

这听起来像你会更好地使用像NInject或Autofac这样的依赖注入容器,而不是试图编写自己的。 – mdm 2011-06-14 15:24:34

+0

@mdm目前查找Ninject,它似乎是有道理的.sort of。 – 2011-06-14 15:43:22

回答

2

你不能。

属性被编译为程序集中的元数据。
属性参数只能是基元或Type对象。

+0

这是一个耻辱。啊,不得不实施一个默认值的负载。尽管如此,做这样的事情的方式将会很整齐。 – 2011-06-14 15:23:01

0

您无法更改属性的参数,因为它们已编译并存储在程序集元数据中。

您可能会在您的组件上实现一个接口,例如IDependantComponent并在创建后调用SetDependencies。

1

正如SLaks所说,这是行不通的。你试图建立的是所谓的“依赖注入”,它是一种强大且越来越流行的模式。有许多为.NET构建的依赖注入框架 - 我建议对它们进行一些研究并选择它们 - 它们有机制(通常是XML配置文件)来处理你正在尝试做的事情。

+0

我在DI上做了一些Google搜索,大致了解它..但它如何适用于我的情况? – 2011-06-14 16:31:17