将对公共setter的访问限制为特定对象(C#)
我正在尝试创建一个类(用C#)作为我的应用程序的环境 我试图使类成为动态的,并将其作为参数发送到应用程序中的实体。问题是,我希望能够更改此环境类(公共setter)的属性,但同时希望接收环境的类不能使用这些setter 我似乎找不到一个好方法来表达我的问题(我认为这是我在Google或msdn上找不到类似问题的部分原因),但简而言之,我想创建一个带有setter的类,这些setter只对我的一些对象公开,而不是对所有对象公开 我现在有一个有趣的想法: 同时避免使用公共setter,并使用事件注册公开私有字段 该类将注册到新的第三个对象中的事件(作为参数发送给构造函数)。将由环境注册的方法不比setter多很多,因此触发这些事件将“允许访问”私有字段 我喜欢一些想法(因为我觉得我的想法并不那么好),或者更好的是一些我可以利用的模式 提前感谢您需要的“内部”还不够吗 您可以将setter作为显式实现移动到接口中。然后,它们将从公共接口隐藏,并且仅当您强制转换到该接口时才可访问 如果您想确保没有其他人可以调用它,您可以向这些函数添加一些参数,在这些函数中,您需要一个特定的令牌对象,而您只将它提供给受信任的类将对公共setter的访问限制为特定对象(C#),c#,oop,setter,C#,Oop,Setter,我正在尝试创建一个类(用C#)作为我的应用程序的环境 我试图使类成为动态的,并将其作为参数发送到应用程序中的实体。问题是,我希望能够更改此环境类(公共setter)的属性,但同时希望接收环境的类不能使用这些setter 我似乎找不到一个好方法来表达我的问题(我认为这是我在Google或msdn上找不到类似问题的部分原因),但简而言之,我想创建一个带有setter的类,这些setter只对我的一些对象公开,而不是对所有对象公开 我现在有一个有趣的想法: 同时避免使用公共setter,并使用事件注册
void SetX(int value, object token)
{
if(token!=correctToken)
throw new ArgumentException("wrong token");
x=value;
}
“内部”不足以满足您的需求吗
您可以将setter作为显式实现移动到接口中。然后,它们将从公共接口隐藏,并且仅当您强制转换到该接口时才可访问
如果您想确保没有其他人可以调用它,您可以向这些函数添加一些参数,在这些函数中,您需要一个特定的令牌对象,而您只将它提供给受信任的类
void SetX(int value, object token)
{
if(token!=correctToken)
throw new ArgumentException("wrong token");
x=value;
}
也许我不太了解一些事情,但我认为乔恩也有类似的问题。也许这对你有帮助。也许我理解得不太清楚,但我认为乔恩也有类似的问题。也许这可以帮助您。您可以尝试使用程序集。这将只允许您指定的程序集访问您的隐私(窃笑)。您可以尝试使用程序集。这将只允许您指定的程序集访问您的隐私(窃笑)。如何
class Callee
{
public void SetX(TypeOfCaller caller, int value)
{
}
}
class TypeOfCaller
{
public void Do()
{
Callee instance;
//..
instance.SetX(this, 5);
}
}
这样做;您还可以使用Visual Studio的“查找引用”功能!如果您需要多种类型的呼叫者;您可以选择类层次结构,也可以只使用所需的重载
class Callee
{
public void SetX(TypeOfCaller caller, int value)
{
}
}
class TypeOfCaller
{
public void Do()
{
Callee instance;
//..
instance.SetX(this, 5);
}
}
这样做;您还可以使用Visual Studio的“查找引用”功能!如果您需要多种类型的呼叫者;您可以选择类层次结构,也可以简单地使用所需的重载。您可以创建一个代理,并将该代理发送到实体类
class MyClass
{
public int MyProperty { get; set; }
}
class MyProxyClass
{
public MyProxyClass(MyClass myClass)
{
_myClass = myClass;
}
private MyClass _myClass;
public int MyProperty
{
get { return _myClass.MyProperty; }
}
}
您可以创建一个代理,并将该代理发送到实体类
class MyClass
{
public int MyProperty { get; set; }
}
class MyProxyClass
{
public MyProxyClass(MyClass myClass)
{
_myClass = myClass;
}
private MyClass _myClass;
public int MyProperty
{
get { return _myClass.MyProperty; }
}
}
为什么不返回受保护对象的克隆而不是实际对象?在不增加任何复杂性的情况下解决问题
public class MyService
{
private List<MyObject> _protectedObjects = new List<MyObject>();
public MyObject GetItem(int id)
{
return (MyObject)_protectedObjects.First(i => i.Id == id).Clone();
}
}
public class MyObject : ICloneable
{
//[...]
public object Clone()
{
return MemberwiseClone();
}
}
公共类MyService
{
私有列表_protectedObjects=新列表();
公共MyObject GetItem(内部id)
{
return(MyObject)u protectedObjects.First(i=>i.Id==Id.Clone();
}
}
公共类MyObject:iClonable
{
//[...]
公共对象克隆()
{
返回MemberwiseClone();
}
}
为什么不返回受保护对象的克隆,而不是实际对象?在不增加任何复杂性的情况下解决问题
public class MyService
{
private List<MyObject> _protectedObjects = new List<MyObject>();
public MyObject GetItem(int id)
{
return (MyObject)_protectedObjects.First(i => i.Id == id).Clone();
}
}
public class MyObject : ICloneable
{
//[...]
public object Clone()
{
return MemberwiseClone();
}
}
公共类MyService
{
私有列表_protectedObjects=新列表();
公共MyObject GetItem(内部id)
{
return(MyObject)u protectedObjects.First(i=>i.Id==Id.Clone();
}
}
公共类MyObject:iClonable
{
//[...]
公共对象克隆()
{
返回MemberwiseClone();
}
}
我想我还是会采用这种方法。我需要做一些工作才能使这段代码不言自明,但这是我现在能想到的最好的选择。谢谢我想我还是要用这种方法。我需要做一些工作才能使这段代码不言自明,但这是我现在能想到的最好的选择。谢谢