我知道这听起来有点奇怪,但我会尝试解释它:假设我有一个具有很多属性的类,并且它们都是只读的,所以这个类是唯一可以修改它的类属性(它正在侦听事件,并使用该事件中包含的信息填充属性)。
但是,我想在某些结构上封装一些属性,以创建一个组织良好的层次结构,因此除了所有者类之外,这些结构的属性也应该是只读的。例如:
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!!
}
}
我想我不能这样做,但有谁知道我怎么能实现它? 非常感谢你提前。
答案 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; }
}