我有一个名为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)
}
}
答案 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