C# 授予对特定不相关类的访问权限
Posted
技术标签:
【中文标题】C# 授予对特定不相关类的访问权限【英文标题】:C# Give access to specific unrelated class 【发布时间】:2014-04-21 21:49:46 【问题描述】:有没有办法修改某些属性对特定类的访问?更具体地说,我想创建一个具有公共获取但只能由某个类设置的属性。
例子:
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(不确定这有什么关系),我可以告诉小组中的每个人避免设置值,但我想知道是否有更好的方法。
【问题讨论】:
您必须将一个类嵌套在另一个类中才能使其工作。 如果我将 Class2 嵌套在 Class1 中,我应该如何从其他类访问它?我需要 Class1 的实例还是需要说 Class1.Class2.SomeInt? 你想用这个实现什么?可能有一种更简单的方法可以满足您的需求。 不设置该类的属性怎么样?为什么要阻止它?谁是你班级的消费者,你还是其他人? 至少你的示例代码有什么阻止你在Class1
内声明 static int SomeInt get; private set;
吗?
【参考方案1】:
这在 C# 中似乎是不可能的。您只能使用public
、protected
、protected internal
、internal
和private
访问修饰符。
但是,例如,您可以创建一个只包含这两个类的程序集,并为 SomeInt
设置器设置 internal
修饰符,或者将一个类嵌套到另一个类中。
如果您只想从 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;
【讨论】:
【参考方案2】:这听起来像 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
上的公共成员。
【讨论】:
知道我正在寻找的是一个“朋友”访问修饰符,我做了一些研究并找到了StrongNameIdentityPermission。我仍在阅读它以查看是否可以使用它,但如果可行,我将检查此答案是否为我使用的答案 @user3390855:您还可以查看程序集的InternalsVisibleTo
指令。它可能很容易导致几个程序集比其他方式更紧密地耦合,但在某些情况下可能会起到作用,允许您使用 internal
作为friend
的替代品。
是的,这就是我最终所做的。我打算更改链接,但没有时间编辑评论。感谢您的帮助。以上是关于C# 授予对特定不相关类的访问权限的主要内容,如果未能解决你的问题,请参考以下文章