Изменение приватных переменных объекта с отложенной загрузкой - PullRequest
1 голос
/ 03 апреля 2010

У меня проблема с частными установщиками при использовании NHibernate и отложенной загрузки. Допустим, у меня есть класс, который выглядит так:

public class User
{
    public virtual int Foo {get; private set;}
    public virtual IList<User> Friends {get; set;}

    public virtual void SetFirstFriendsFoo()
    {
        // This line works in a unit test but does nothing during a live run with
        // a lazy-loaded Friends list
        Friends(0).Foo = 1; 
    }
}

Вызов SetFirstFriendsFoo прекрасно работает внутри модульного теста (как и должно быть, поскольку объекты одного типа могут обращаться к закрытым свойствам друг друга ).

Однако при запуске в режиме реального времени со списком друзей, загруженных с отложенной загрузкой, вызов SetFirstFriendsFoo автоматически завершается неудачно. Я предполагаю, что причина этого в том, что во время выполнения объект Users (0) .Foo больше не имеет тип User, а принадлежит прокси-классу, который наследуется от User, поскольку список друзей был загружен с отложенной загрузкой. *

У меня такой вопрос: не должно ли это генерировать исключение во время выполнения? Вы получаете исключения во время компиляции, если пытаетесь получить доступ к закрытым свойствам другого класса, но когда вы сталкиваетесь с такой ситуацией, похоже, что приложение просто игнорирует вас и продолжает свой путь.

Примечание: если я изменю "закрытый набор" на "защищенный набор", все будет работать нормально.

1 Ответ

1 голос
/ 03 апреля 2010

Как указывает Пако, только виртуальные методы / свойства могут быть проксированы, а C # не допускает виртуальных закрытых членов.

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

// edit: fixed to use GetType
Type type = Friend[ 0 ].GetType().BaseType;
type.GetProperty("Foo",BindingFlags.Instance|BindingFlags.NonPublic).SetValue( Friends[0], 1, null );

Кроме того, вы можете использовать Fasterflect и делать то же самое, как это:

Friends[ 0 ].SetPropertyValue( "Foo", 1 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...