改变延迟加载对象的私有变量

时间:2010-04-03 13:27:16

标签: c# nhibernate accessibility

使用NHibernate和延迟加载时,我遇到了私有setter的问题。假设我有一个看起来像这样的课程:

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调用在单元测试中完美无缺(从objects of the same type can access each others private properties起应该如此)。

但是,当使用延迟加载的好友列表进行实时运行时,SetFirstFriendsFoo调用将以静默方式失败。我猜测的原因是因为在运行时,Users(0).Foo对象不再是User类型,而是继承自User的代理类,因为Friends列表是延迟加载的。

我的问题是:这不应该产生运行时异常吗?如果你试图访问另一个类的私有属性,你会得到编译时异常,但是遇到这样的情况看起来应用程序只是忽略了你并继续沿着它继续。

注意:如果我将“私人套装”更改为“受保护套装”,一切正常。

1 个答案:

答案 0 :(得分:1)

正如Paco所指出的,只能代理虚拟方法/属性,而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 );