Доступ к внутреннему свойству вне области сборки - PullRequest
2 голосов
/ 04 декабря 2008

У меня есть класс с внутренним свойством:

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 ]

1 голос
/ 04 декабря 2008

Почему именно внутренняя собственность в первую очередь? Если вы хотите иметь публичный доступ к нему, сделайте его публичным. Я предполагаю, что у вас есть некоторый контроль над этим, так как иначе вы бы не смогли добавить публичный метод для доступа к нему в первую очередь.

Если вы хотите, чтобы только другие сборки могли иметь к нему доступ, InternalsVisibleTo - ваш друг (каламбур не предназначен) - но, как говорит Эрик, вы должны тщательно продумать конструкцию на этом этапе.

Относительно того, почему вы получаете именно эту ошибку - похоже, ваш прокси-сервер AOP все еще пытается переопределить внутреннее свойство, а не использовать ваш публичный метод. Трудно понять, можете ли вы изменить это, не зная больше о вашей конкретной настройке, но сделать свойство общедоступным, вероятно, будет проще.

0 голосов
/ 04 декабря 2008

Да, я согласен, что это странный дизайн. Я пойду с защищенным модификатором, так как атрибут InternalVisibleTo у меня не работает.

0 голосов
/ 04 декабря 2008

Похоже, вы должны пересмотреть свой выбор дизайна. Внутренний используется, чтобы избежать того, что вы пытаетесь сделать, поэтому рассмотрите возможность использования какого-либо публичного доступа к свойствам.

Можно использовать атрибут InternalsVisibleTo, чтобы сделать конкретную сборку способной достигать внутренних свойств, но с моей точки зрения это плохой дизайн.

...