通过方法而不是直接暴露属性

时间:2014-01-13 20:48:16

标签: c#

我有一个非常简单的要求

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。我怎么做?

3 个答案:

答案 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以查看您的选项。

希望我帮忙!