如何防止更改属性的属性?

时间:2014-04-21 08:16:22

标签: c#

我有一个名为Class1的类,在这个类中我有一个名为MyProperty的属性。在另一个类中,我声明了Class1属性,但我希望在这种情况下MyProperty是readonly。我怎么能这样做?

public class Class1
{
     public int MyProperty { get; set; }
}

public class Class2
{
     public Class1 Class1Property { get; }
}

public class Class3
{
    void Method()
    {
        Class2 obj = new Class2();
        obj.Class1Property.MyProperty = 2;//I want this be illegal (In this place only)
    }
}

4 个答案:

答案 0 :(得分:5)

进行一些进一步的抽象并为Class1创建一个界面:

public interface IClass1
{
    int MyProperty { get; }
}

然后让Class1实现此接口:

public class Class1 : IClass1
{
    public int MyProperty { get; set; }
}

Class2不应公开Class1个实例,而应公开IClass1的实例:

public class Class2
{
    public IClass1 Class1Property { get; }
}

现在你得到了你想要的行为:

public class Class3
{
    void Method()
    {
        Class2 obj = new Class2();
        obj.Class1Property.MyProperty = 2; // Doesn't work.
    }
}

答案 1 :(得分:3)

Class1已决定MyProperty可修改,无论您如何获得Class1,所以您想要的只是不可能。

但是,有一些方法可以重新设计您的设计。这是我要采取的方法:

public class ReadOnlyClass1
{
    public int MyProperty { get; protected set; }
}

public class Class1 : ReadOnlyClass1
{
    public new int MyProperty {
        get { return base.MyProperty; }
        set { base.MyProperty = value; }
    }
}

现在,您可以为Class3提供ReadOnlyClass1类型的属性。

答案 2 :(得分:0)

有几种方法可以做到这一点,评论中提到的最简单的方法是制作" MyProperty"私人:

public int MyProperty { get; private set; }

您还可以尝试其他更符合您需求的访问修饰符。

考虑一下get和set的含义:编译时,Getter和Setter方法的创建方式与java中实现的方法非常相似。

您还可以使用" get"创建该属性。并实施" set"属性本身之外的功能(如类构造函数,内部方法或类似的东西)。

答案 3 :(得分:0)

public int myProperty{get;private set;}//this is read only property

obj.Class1Property.MyProperty = 2;//this is illegal