【问题标题】:Using 'new SomeObject' in custom attributes在自定义属性中使用“new SomeObject”
【发布时间】:2011-06-14 15:19:40
【问题描述】:

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

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

但是,这意味着我必须为要以这种方式添加的每个组件使用默认值。我希望能够做到:

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

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

这可能吗?

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

【问题讨论】:

  • 参数是什么?
  • 听起来你最好使用像 NInject 或 Autofac 这样的依赖注入容器来处理这种事情,而不是尝试自己编写。
  • @mdm 目前正在查找 Ninject,这似乎是有道理的......有点。
  • 我觉得这可能是一个新问题,但我看不出 DI 在这里会有什么好处。我可以只是了解这个概念,但我不知道看不到它是如何链接到这里的。我确定确实如此,但我只是没看到。

标签: c# attributes constructor parameter-passing custom-attributes


【解决方案1】:

你不能。

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

【讨论】:

  • 真可惜。嗯,应该只需要实现一些默认值。不过,做这样的事情的方法会很整洁。
【解决方案2】:

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

【讨论】:

  • 我在 DI 上进行了一些谷歌搜索并大致了解它..但它如何适用于我的情况?
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2018-09-12
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 2010-12-05
    相关资源
    最近更新 更多