2

我有内部属性的类:

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

4

3 回答 3

2

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

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

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

于 2008-12-04T08:51:45.033 回答
0

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

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

于 2008-12-04T08:46:43.403 回答
0

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

于 2008-12-04T10:43:45.960 回答