C#授予访问特定无关类的权限

时间:2014-03-16 19:23:23

标签: c# properties xna access-modifiers

有没有办法修改某个属性对特定类的访问?更具体地说,我想创建一个具有公共get的属性,但只能由某个类设置。

示例:

public Class1
{
    Class2.SomeInt = 5;
}

public static Class2
{
    private static int someInt;
    public static int SomeInt
    {
        get { return someInt; }
        (give access to Class1 only somehow?) set { someInt = value; }
    }
}

更新(更多信息): 我在xna中这样做,我希望主类型(Game1)是唯一可以修改静态助手类的东西。这是针对学校的小组项目,我们正在使用SVN(不确定它是如何相关的),我可以告诉我小组中的每个人都避免设置值,但我想知道是否有更好的方法。 / p>

2 个答案:

答案 0 :(得分:1)

在C#中似乎是不可能的。您只能使用publicprotectedprotected internalinternalprivate访问修饰符。
但是,例如,您可以创建一个仅包含这两个类的程序集,并为internal setter设置SomeInt修饰符或将一个类嵌套到另一个类中。
如果您只想隐藏IntelliSense中的setter,可以在某个界面中定义此setter并明确实现:

public interface IHidden<T>
{
    T HiddenPropery { set; }
}

public class SomeClass : IHidden<int>
{
    private int someInt;
    public int HiddenPropery
    {
        get { return someInt; }
    }

    int IHidden<int>.HiddenPropery
    {
        set { someInt = value; }
    }
}

用法:

// This works:
((IHidden<int>)new SomeClass()).HiddenPropery = 1;
// This doesn't:
new SomeClass().HiddenPropery = 1;

答案 1 :(得分:1)

这听起来像是friend访问修饰符,C#没有。我在C#中看到的最接近的是将“无关”类作为接口并在类中具有私有实现。像这样:

public interface IWidget
{
    void DoSomethingPublic();
}

public class SomeObject
{
    private ObjectWidget _myWidget = new ObjectWidget();
    public IWidget MyWidget
    {
        get { return _myWidget; }
    }

    private class ObjectWidget
    {
        public void DoSomethingPublic()
        {
            // implement the interface
        }

        public void DoSomethingPrivate()
        {
            // this method can only be called from within SomeObject
        }
    }
}

SomeObject外部的代码可以与MyWidget互动并查看IWidget界面上的任何内容,但SomeObject内部的代码也可以在MyWidget上与非公共成员接口{1}}。