访问装配范围之外的内部属性

时间:2008-12-04 08:37:43

标签: c# oop language-features

我有内部属性的课程:

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映射器覆盖以注入持久性代码。

3 个答案:

答案 0 :(得分:1)

为什么房产内部首先?如果您想要公开访问它,请将其公开。我假设您对此有一些控制权,否则您将无法首先添加公共方法来访问它。

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

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

答案 1 :(得分:0)

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

可以使用InternalsVisibleTo属性来使特定的程序集能够达到内部属性,但从我的角度来看,这是一个糟糕的设计。

答案 2 :(得分:0)

是的我同意这是奇怪的设计。我将使用protected modifier,因为InternalVisibleTo属性对我不起作用。