【问题标题】:Accessing internal property out of the assembly scope访问程序集范围之外的内部属性
【发布时间】:2010-09-25 06:59:19
【问题描述】:

我有具有内部属性的课程:

internal virtual StateEnum EnrolmentState  
{
    get { ..getter logic }
    set { ..setter logic }
}

但是我希望能够在程序集之外访问此属性,因此我创建了仅返回此属性的方法:

public StateEnum GetCurrentState()
{
    return EnrolmentState;
}

但是当我从这个程序集之外的类调用这个方法时,我得到一个异常

(System.TypeLoadException: Method 'get_EnrolmentState' on type 'EnrolmentAopProxy' from assembly '44fe776f-458e-4c5d-aa35-08c55501dd43, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is overriding a method that is not visible from that assembly.)

因此可以以任何方式访问程序集之外的内部成员,或者我应该考虑另一种方法。

顺便提一下,这个类被用作 O/R 映射器实体 (NPersist),它被 O/R 映射器覆盖以注入持久性代码。

【问题讨论】:

  • 那是您的确切代码吗?因为在指定的代码中没有提到 EnrolmentState,但在日志中提到了
  • 是的,我只添加了一个示例代码,而实际代码是虚拟内部属性“EnrolmentState”。感谢您的评论
  • 好的,我已经根据这个编辑了我的答案。

标签: c# oop language-features


【解决方案1】:

是的,我同意这是一个奇怪的设计。我将使用受保护的修饰符,因为InternalVisibleTo 属性对我不起作用。

【讨论】:

    【解决方案2】:

    为什么属性首先是内部的?如果您想公开访问它,请将其设为公开。我假设您对此有一定的控制权,否则您一开始就无法添加公共方法来访问它。

    如果您只希望选定的其他程序集能够访问它,InternalsVisibleTo 是您的朋友(双关语不是故意的) - 但正如 Erik 所说,您此时应该仔细考虑设计。

    至于为什么您会收到该特定错误 - 看起来您的 AOP 代理仍在尝试覆盖内部属性,而不是使用您的公共方法。在不了解您的特定设置的情况下,很难知道您是否可以更改它 - 但将属性公开可能是一个更简单的解决方法。

    【讨论】:

      【解决方案3】:

      这听起来你应该重新考虑你的设计选择。 Internal 用于避免您尝试执行的操作,因此请考虑使用某种对属性的公共访问权限。

      可以使用 InternalsVisibleTo 属性使特定程序集能够访问内部属性,但在我看来这是一个糟糕的设计。

      【讨论】:

        猜你喜欢
        • 2016-06-23
        • 1970-01-01
        • 1970-01-01
        • 2011-06-01
        • 2012-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多