我有一个非常简单的要求
public class A
{
public int Index{get;set;}
public B ConfigOne{get;set;}
public B ConfigTwo{get;set;}
public void SetConfigOne(string val1, string val2);
public void SetConfigTwo(string val1, string val2);
}
public class B
{
public string Val1{get;set;}
public string Val2{get;set;}
}
我如何安排我的两个课程,以便我能够做到这一点:
var a = A.ConfigOne.Val1;
但不是
A.ConfigOne.Val1 = a;
所以基本上我想让我的间接类(B)属性readOnly,仍然可以在A类中设置。 我想通过一个方法公开setter。我怎么做?
答案 0 :(得分:4)
创建一个只向B
可以实现的数据公开只读视图的界面。这意味着任何直接引用B
对象的人都可以设置其数据,但是当从A
中的属性访问时,它将是只读的:
public interface IReadValues
{
string Val1 { get; }
string Val2 { get; }
}
public class A
{
public int Index { get; set; }
public IReadValues ConfigOne { get; set; }
public IReadValues ConfigTwo { get; set; }
public void SetConfigOne(string val1, string val2);
public void SetConfigTwo(string val1, string val2);
}
public class B : IReadValues
{
public string Val1 { get; set; }
public string Val2 { get; set; }
}
通过不使用自动属性,而A
具有通过显式属性公开的类型B
的字段,您可以确保A
类可以将这些对象修改为好。
答案 1 :(得分:0)
您可以使用内置参数访问器执行此操作。通过方法这样做是非常典型的。将setter设为私有意味着只能从该类访问它,就像任何其他私有对象一样。
public class A
{
public int Index{get;set;}
public B ConfigOne{get; }
public B ConfigTwo{get; }
}
public class B
{
public B(string val1, string val2)
{
this.Val1 = val1;
this.Val2 = val2;
}
public string Val1{get; private set;}
public string Val2{get; private set;}
}
答案 2 :(得分:0)
我想它无法制作。当你发表声明时:
A.ConfigOne.Val1 = a;
你实际上通过语句
公开了B类对象A.ConfigOne
然后设置属性Val1。如果属性不可设置,则无法设置。
如果您希望仅从特定类设置B的属性,那么您应该使用方法而不是属性。例如:
public class A
{
public int Index{get;set;}
public B ConfigOne{get;set;}
public B ConfigTwo{get;set;}
public void SetConfigOne(string val1, string val2);
public void SetConfigTwo(string val1, string val2);
//This method exposes the new functionality
public void setVal1OfConfig1(string value){
ConfigOne.Val1 = value;
}
}
public class B
{
protected string Val1{get;set;}
protected string Val2{get;set;}
}
在这种情况下,只有来自同一程序集的类才能更改TempProperty的值。因此,A类应该在同一个组件上。检查access modifiers以查看您的选项。
希望我帮忙!