【问题标题】:Members which are only public from another assembly仅在另一个议会中公开的成员
【发布时间】:2014-03-11 14:13:33
【问题描述】:

在 C# 中,我们可以将任何成员定义为 Internal,这使其仅在当前程序集中可见:

internal int Age; 

我想知道是否有可能扭转这种效果,将其标​​记为对此程序集私有/受保护,但对指定的其他程序集公开。

这听起来很疯狂,但我们有充分的理由这样做。我们正在使用 Unity3D 游戏引擎,我们所有的游戏逻辑都在“运行时”程序集中。我们还可以为这些类定义自定义编辑器,这允许我们在 IDE 中创建自定义 UI 控件。这些编辑器存在于一个特殊的“编辑器”程序集中。

此编辑器程序集经常需要有关运行时程序集中特定类型的更多信息,然后我们希望将其公开给我们自己的程序集。我们目前的解决方案是通过反射获取特定的私有/受保护成员,但我想知道是否有更好的解决方案。

【问题讨论】:

  • InternalsVisibleTo 可能会有所帮助。
  • “这听起来完全疯了” 是的,确实如此。 “我们有正当理由这样做” 好的,那你能详细说明一下吗?因为,在你刚才的解释中,我没有看到任何正当理由。
  • @UfukHacıoğulları 谢谢!
  • @MarkSeemann 我相信我确实解释了我们的情况,外部程序集需要比当前更多的信息,因为它是 IDE 中的编辑器。
  • “当前”是什么意思?

标签: c# oop


【解决方案1】:

您无法更改这些成员的可见性。

一种选择是创建一个公开所需成员的接口,然后显式实现它:

class MyClass : IEditable
{ 
    internal int Age { get; private set; }
    int IEditable.Age { get; set; }
}

在这种情况下,您必须将 MyClass 转换为 IEditable 才能访问属性。它还有助于确定更改运行时程序集何时会破坏编辑器。

【讨论】:

  • 这不会使类more 可用于外部程序集而不是本地程序集。在both 情况下,客户端必须对接口进行编程。它并不能解决问题,而不仅仅是公开所做的一切。
  • @MarkSeemann 我不知道究竟是什么问题,我认为 OP 在“运行时程序集”中编程时需要一个干净的 IntelliSense。
  • 还不错.. 我也不知道问题是什么 :)
  • 干净的智能感知是一回事,但隐藏成员还有许多其他优点。
【解决方案2】:

这听起来确实像一个设计问题。两个程序集都必须知道的数据应该被隔离到它自己的程序集中并由它们中的每个程序集引用。如果做不到这一点,您可以考虑创建一个包装器/适配器,以对其他程序集可用的只读方式公开公开核心程序集中的隐藏数据。

【讨论】:

    猜你喜欢
    • 2013-03-25
    • 2021-02-18
    • 2022-06-15
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 2020-09-27
    相关资源
    最近更新 更多