2012-09-20 48 views
0

我知道这听起来有点奇怪,但我会尝试解释它:假设我有一个有很多属性的类,并且它们都是只读的,所以这个类是唯一可以修改其属性的类(它正在监听一个事件,并用该事件中包含的信息填充属性)。我可以在一个只能由一个具体类访问的“set”结构中创建一个属性吗?

但是,我想封装一些结构的一些属性,以创建一个组织良好的层次结构,所以这些结构的属性也应该是只读的,除了所有者类。例如:

public class A 
{ 
    private int a1; 
    public int A1 
    { 
     get{ return a1; } 
    } 

    private B structB; 
    public B StructB 
    { 
     get{ return structB; } 
    } 

    private method eventListenerMethod(...) 
    { 
     a1 = someValue; 
     structB.B1 = otherValue; //I want that only this class can modify this property! 
    } 
} 

public struct B 
{ 
    private int b1; 
    public int B1 
    { 
     get{ return b1; } // This property should be modifiable for Class A!! 
    } 
} 

我想我不能那样做,但有人知道我该如何实现它吗? 非常感谢您提前。

+2

让你的结构的副本,改变问题的性质。不要变异。可变的结构是邪恶的。 http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil – spender

回答

1

似乎你在追求的是C++中的“朋友”关键字。但是,它不存在于C#中,但“内部”是一个很好的折衷。所以,只需创建一个“内部集合”属性,这个属性只能在组件中访问(仅)。那么,谁将会使用你的程序集其他人将无法获得它

+0

C#中的'internal'完全等价于VB.NET中的'Friend' – greg84

+0

是的,我一直在寻找“friend”关键字,这是我需要的,但我喜欢这个解决方案:我的问题是,使用我的DLL的其他程序不应该修改属性,并且此解决方案可以实现此目的。谢谢!! – DarthRoman

+0

'public int B1 { \t internal set {b1 = value; } \t get {return b1; } //这个属性应该可以修改为A类! }' 尝试类似这样的代码 - DLL以外的代码将会看到属性,但只有getter .. –

0

更改structclass并使其private,而是把它定义里面class A

这将意味着只有class A才有权访问其属性。 class B中的所有属性都可以公开(因为只有定义它的类才能访问它)。

这将导致编译器错误,因为class B将是私有的,但暴露在公共属性上。为了解决这个问题,建立一个公开接口,以IClassB(坏名字,但你明白了)的类型公开,并将属性类型更改为接口。确保此接口仅获取属性方法签名的访问器。

像这样的东西应该工作:

public class A : IClassB 
{ 
    public IClassB B { get; } 

    private class B : IClassB 
    { 
     public int B1 { get; } 
    } 
} 

public interface IClassB 
{ 
    int B1 { get; } 
} 
相关问题