我们可以使一个类的属性对public公开,但只能由某些特定类修改吗?
例如,
// this is the property holder
public class Child
{
public bool IsBeaten { get; set;}
}
// this is the modifier which can set the property of Child instance
public class Father
{
public void BeatChild(Child c)
{
c.IsBeaten = true; // should be no exception
}
}
// this is the observer which can get the property but cannot set.
public class Cat
{
// I want this method always return false.
public bool TryBeatChild(Child c)
{
try
{
c.IsBeaten = true;
return true;
}
catch (Exception)
{
return false;
}
}
// shoud be ok
public void WatchChild(Child c)
{
if( c.IsBeaten )
{
this.Laugh();
}
}
private void Laugh(){}
}
儿童是一个数据类,
父是一个可以修改数据的类,
Cat 是一个只能读取数据的类。
有没有办法在C#中使用Property实现这种访问控制?
答案 0 :(得分:4)
您可以提供一种方法,而不是公开Child类的内部状态:
class Child {
public bool IsBeaten { get; private set; }
public void Beat(Father beater) {
IsBeaten = true;
}
}
class Father {
public void BeatChild(Child child) {
child.Beat(this);
}
}
然后猫不能打败你的孩子:
class Cat {
public void BeatChild(Child child) {
child.Beat(this); // Does not compile!
}
}
如果其他人需要能够击败孩子,请定义他们可以实施的界面:
interface IChildBeater { }
然后让他们实现它:
class Child {
public bool IsBeaten { get; private set; }
public void Beat(IChildBeater beater) {
IsBeaten = true;
}
}
class Mother : IChildBeater { ... }
class Father : IChildBeater { ... }
class BullyFromDownTheStreet : IChildBeater { ... }
答案 1 :(得分:2)
这通常通过使用单独的程序集和InternalsVisibleToAttribute来实现。当您在当前程序集中标记set
internal
个类时,将有权访问它。通过使用该属性,您可以为特定的其他程序集提供访问权限。请记住,使用Reflection它仍然可以编辑。