属性私人集;

Eri*_*ric 46 c# properties

我知道它只允许班级设置它,但重点是什么?

如何解决只读ID的问题?

说我有一个人班:

public class Person
    {
        public string Name { get;  set; }
        public int Id { get; private set; }
        public int Age { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

这是一个Entities.dll由GUI,BL和DAL使用的.

GUI调用BL:

   List<Person> p =  BL.PeopleBL.GetPeople();
Run Code Online (Sandbox Code Playgroud)

为了示例,调用DAL:

...
while(dr.read())
{
    returnPersonList.add( new Person{ Age=dr.GetInt32(1), Id=dr.GetInt32(0), Name=dr.GetString(2)})
}
...
Run Code Online (Sandbox Code Playgroud)

当然我不能那样做因为Id是私人套装; 这样做的正确方法是什么?

如何让BL/Dal设置Id,而不是GUI?

或者这甚至没有正确使用私人套装?


我只想补充一点,这是典型的数据库应用程序,其中pk是Id,不应更改(仅限BL/DAL)


Bli*_*ieg 38

这是一种可能的解决方案,虽然不是很干净:

  1. 使您需要的属性暴露给BAL和DAL internal
  2. 马克BAL.dllDAL.dll 内部可见assemblyinfo.cs

public class Person
{
    public Person(int id)
    {
         this.Id=id;
    }

    public string Name { get;  set; }
    public int Id { get; internal set; }
    public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

AssemblyInfo.cs 对于 Entities.dll

[assembly: InternalsVisibleTo("DAL"), InternalsVisibleTo("BAL")]
Run Code Online (Sandbox Code Playgroud)

这样,DAL和BAL都可以看到您的所有内部信息.这可能不太理想,但我只是建议一种可能的解决方案.


Rex*_*x M 18

两种常见的方法是要么类应该有一个DAL的构造函数,要么DAL应该使用反射来水合对象.


Gre*_*ire 12

或者你可以做到

public class Person
{
    public Person(int id)
    {
         this.Id=id;
    }

    public string Name { get;  set; }
    public int Id { get; private set; }
    public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*vis 9

也许我是误解,但如果你真的想要读取ID,为什么不使用实际的只读字段呢?

public class Person
{
   public Person(int id)
   {
      m_id = id;
   }

   readonly int m_id;
   public int Id { get { return m_id; } }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ann 7

您可以通过构造函数提供用户来设置只读属性:

public class Person
{
    public Person(int id)
    {
        this.Id = id;
    }

    public string Name { get;  set; }
    public int Id { get; private set; }
    public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)