【问题标题】:How to create class with every Property as Static?如何创建每个属性为静态的类?
【发布时间】:2012-03-12 11:54:47
【问题描述】:

我创建了包含 3 个类似项目的解决方案。

//Project Name: ClientProject
    public class UserDetails
    {
        public static int ID { get; set; }
        public static string Name { get; set; }
        public static string Email { get; set; }
    }

上面的这个类应该设置一次,当用户登录之后,我想在整个解决方案中访问这些详细信息。

如管理、SalesInfo 项目。

//Project Name: Administration
    public class Admin
    {
        public static UserDetails Details
        {
            //Here i would like to return UserDetails
            get; 
        }
        public static int DepartmentID { get; set; }
        public static string Phone { get; set; }
        public static string Head { get; set; }
    }

    //Project Name: SalesInfo
    public class Sales
    {
        public static UserDetails Details
        {
            //Here i would like to return UserDetails
            get;
        }
        public static DateTime Date { get; set; }
        public static string Item { get; set; }
        public static int Price { get; set; }
    }

任何答案、评论或建议将不胜感激

【问题讨论】:

  • 这是一个网络应用程序吗?赢得表格? WPF?每个人都应该可以访问该信息还是“每个用户”?你看过设计模式吗?
  • 这是一个非常糟糕的设计决策。使用 OOP 机制难以测试且无法扩展。如果您想要一个类的单个实例,请查找 Singleton 模式,但一定要让您的类成员实例化。从你的问题我推测static,你的意思是只读?
  • 你可以使用静态构造函数。
  • 1.您有具有完全静态成员的非静态类。 2. 您不需要将UserDetails 公开为这些其他类的静态属性——它已经可以全局访问,只需在需要时以UserDetails.Name &c 的形式访问它。
  • 这是一个可怕的想法......

标签: c# properties static-class


【解决方案1】:

通常属性使用私有字段来存储数据。此行为是在编译时添加的,并且在编码时对开发人员隐藏。静态方法/属性无法访问类中的私有变量/字段。

我推荐使用单例模式。

public class UserDetails
{
    private static UserDetails _instance;

    public int ID { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }

    private UserDetails() {}

    public static UserDetails Instance
    {
        get
        {
            if (_instance == null)
            {
                 _instance = new UserDetails();
            }
            return _instance;
        }
    }
}

你可以这样消费,

//Project Name: Administration
public class Admin
{
    public static UserDetails Details
    {
        get
        {
            return UserDetails.Instance;
        } 
    }
    public static int DepartmentID { get; set; }
    public static string Phone { get; set; }
    public static string Head { get; set; }
}

【讨论】:

【解决方案2】:

使用 Groo 提到的一种单例。

public class UserDetails
{
  public static int ID { get; private set; }
  public static string Name { get; private set; }
  public static string Email { get; private set; }

  private static UserDetails _userDetails;

  private UserDetails(int id, string name, string email)
  {
    ID = id;
    Name = name;
    Email = email;
  }

  public static UserDetails CreateUserDetails(int id, string name, string email)
  {
    if (_userDetails != null)
    {
      throw new MyException("Second call to UserDetails.CreateUserDetails!");
    }
    _userDetails = new UserDetails(id, name, email);

    return _userDetails;
  }

  public static UserDetails GetUserDetails()
  {
    if (_userDetails == null)
    {
      throw new MyException("Not yet created by calling UserDetails.CreateUserDetails!");
    }

    return _userDetails;
  }

}

登录后调用UserDetails.CreateUserDetails(...)设置全局对象。
如需了解详情,请致电GetUserDetails()。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 2018-08-07
相关资源
最近更新 更多