2010-01-19 46 views
1

爲什麼NHibernate可以爲具有私有設置者的屬性的類創建代理,但不能爲具有內部設置者的屬性的類創建代理?或者我錯過了一些應該完全明顯的東西?針對內部設置者與私人設置者的NHibernate代理生成

public class PrivateSetter { 
    // no proxy error 
    public virtual string PrivateSetterProperty { get; private set; } 
} 

public class InternalSetter { 
    // proxy error 
    public virtual string InternalSetterProperty { get; internal set; } 
} 
+0

使用什麼代理工廠?城堡?李林甫? – 2010-01-19 23:19:54

+0

他們都有這種行爲。但是,這個異常是由NHibernate的實體驗證器引發的。 – kuhlmancer 2010-01-21 01:36:33

回答

2

這是一個純粹的.NET語言問題。自己嘗試一下:

public class A 
{ 
    public virtual string PrivateSetter { get; private set; } 
    public virtual string InternalSetter { get; internal set; } 
} 
在另一個裝配

public class B : A 
{ 
    // works fine, private isn't derived at all 
    // you can omit the setter, make it public, internal to this 
    // assembly etc. 
    public override string PrivateSetter { get; set; } 

    // compilation time error: setter can't be overridden, 
    // there is no access to it. 
    public override string InternalSetter { get; internal set; } 
} 

順便說一句,我只是分析與私營制定者和代理的問題,所以我不知道,如果真的代理工作在這種情況下。

3

您需要標記作爲二傳手protected internal使代理類都可以訪問它:

public class InternalSetter 
{ 
    public virtual string InternalSetterProperty { get; protected internal set; } 
} 
+0

http://msdn.microsoft.com/en-us/library/ba0a1yw2%28VS.80%29.aspx討論內部和受保護內部之間的區別。受保護的內部實際上受到保護或內部。 @Jamie,我們可以使用InternalsVisibleTo屬性來使Nhibernate或CastleProxy查看內部設置器嗎? – 2010-01-21 00:42:24

+0

我知道關於受保護的內部。我的問題是關於代理類如何訪問私有setter,而不是內部setter。 在完全信任的環境中,您可以看到私人東西而不是內部東西,是否存在某種奇怪的反思? – kuhlmancer 2010-01-21 01:41:47

+0

內部成員無法在Reflection中識別,請參閱http://stackoverflow.com/questions/171332/accessing-internal-members-via-system-reflection。我沒有嘗試InternalsVisibleTo,一旦我發現受保護的內部工作,我沒有給它一秒。 – 2010-01-21 13:11:39