Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将对公共setter的访问限制为特定对象(C#)_C#_Oop_Setter - Fatal编程技术网

将对公共setter的访问限制为特定对象(C#)

将对公共setter的访问限制为特定对象(C#),c#,oop,setter,C#,Oop,Setter,我正在尝试创建一个类(用C#)作为我的应用程序的环境 我试图使类成为动态的,并将其作为参数发送到应用程序中的实体。问题是,我希望能够更改此环境类(公共setter)的属性,但同时希望接收环境的类不能使用这些setter 我似乎找不到一个好方法来表达我的问题(我认为这是我在Google或msdn上找不到类似问题的部分原因),但简而言之,我想创建一个带有setter的类,这些setter只对我的一些对象公开,而不是对所有对象公开 我现在有一个有趣的想法: 同时避免使用公共setter,并使用事件注册

我正在尝试创建一个类(用C#)作为我的应用程序的环境

我试图使类成为动态的,并将其作为参数发送到应用程序中的实体。问题是,我希望能够更改此环境类(公共setter)的属性,但同时希望接收环境的类不能使用这些setter

我似乎找不到一个好方法来表达我的问题(我认为这是我在Google或msdn上找不到类似问题的部分原因),但简而言之,我想创建一个带有setter的类,这些setter只对我的一些对象公开,而不是对所有对象公开

我现在有一个有趣的想法: 同时避免使用公共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();
}
}

我想我还是会采用这种方法。我需要做一些工作才能使这段代码不言自明,但这是我现在能想到的最好的选择。谢谢我想我还是要用这种方法。我需要做一些工作才能使这段代码不言自明,但这是我现在能想到的最好的选择。谢谢