我可以在结构中创建一个属性,只能通过单个具体类访问“set”吗?

时间:2012-09-20 09:34:37

标签: c# properties access-modifiers

我知道这听起来有点奇怪,但我会尝试解释它:假设我有一个具有很多属性的类,并且它们都是只读的,所以这个类是唯一可以修改它的类属性(它正在侦听事件,并使用该事件中包含的信息填充属性)。

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

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 个答案:

答案 0 :(得分:1)

似乎你所追求的是C ++中的“friend”关键字。但是,它在C#中不存在,但“内部”是一个很好的折衷方案。因此,只需创建一个“内部集”属性,该属性在程序集中可以访问(仅限)。因此,使用你的程序集的其他人将无法访问它

答案 1 :(得分:0)

struct更改为class并将其设为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; }
}