如何在c#中实现选择性属性可见性?

时间:2012-12-19 05:13:48

标签: c#

我们可以使一个类的属性对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实现这种访问控制?

2 个答案:

答案 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它仍然可以编辑。