【问题标题】:How to define a static class with members which are the same within the project or solution?如何在项目或解决方案中定义具有相同成员的静态类?
【发布时间】:2019-10-03 19:08:04
【问题描述】:

这是一个初学者问题,对于大多数专家来说可能非常容易。

我正在尝试为案例研究项目(比如说建筑施工示例项目)找到正确的架构/结构。

我正在尝试为一个项目定义一个团队,该团队在所有项目阶段都相同并被引用,其成员在不同阶段被引用和使用。

我创建了一个Person 类,它定义了必填字段,并在我的ProjectTeam 类中使用了它,它是一个通用的List<Person>

  1. 我想知道如何在其他将定义我的项目阶段的类中使用这个ProjectTeam 类?我正在考虑一个静态类,但我不知道如何使用它(p1.png)。

  2. 我应该遵循一个具有不同类的项目的概念,还是遵循一个解决方案的概念,在我的解决方案中使用一个用于不同项目(代表不同阶段)的类库。我在非 UML 图 (p2.png) 中以图形方式展示了第二个想法。

我的课程:

解决方案架构图:

namespace MyClassLibrary
{    public class Person
    {        public enum ERole { Admin, Head, InCharge }
        public string Name { get; set; }
        public ERole Role;
        private decimal rate = 15.00m;
        public decimal Rate
        {   get { return rate; }
            set{ if (rate >= 15.00m) { rate = value; } }
        }
        public Person()
        {
            this.Name = "";
            this.Role = ERole.InCharge;
            this.Rate = 15.00m;
        }
    }
}

namespace MyClassLibrary
{
    public static class ProjectTeam
    {
        public static List<Person> TeamMembers = new List<Person>();
        static ProjectTeam()
        {
            TeamMembers.Add(new Person() { Name = "APerson",
                                           Role = Person.ERole.Admin,
                                           Rate = 30.00m });

            TeamMembers.Add(new Person() { Name = "BPerson",
                                           Role = Person.ERole.Head,
                                           Rate = 25.00m });

            TeamMembers.Add(new Person() { Name = "CPerson",
                                           Role = Person.ERole.InCharge,
                                           Rate = 15.00m });

        }

    }
}


namespace MyClassLibrary
{
    public class Project
    {
        public string ProjectName { get; set; }
        public int ProjectNumber{ get; set; }
        public string ProjectScope { get; set; }


    }
}

【问题讨论】:

  • 感谢您抽出宝贵时间分享您的问题。但是您的问题中缺少一些东西。你的目标是什么?你的问题是什么?到目前为止你做了什么?请尝试更好地解释您的困难并分享更多代码。为了帮助您改进查询的内容、标题和标签,请考虑阅读帮助中心的 How do I ask a good question
  • 嗨,奥利弗,如果给您带来不便,我们深表歉意。我收到了一条评论来发布代码而不是它的图片,并分享了我所拥有的。
  • 嗨,奥利弗,如果给您带来不便,我们深表歉意。我收到了一条评论来发布代码而不是它的图片,并分享了我所拥有的。我将通过你提到的链接。我有两个目标,也许这就是它引起混乱的原因。首先,我试图找出处理一个包含如此多零件的项目的最佳常见做法。其次,我想知道如何通过项目使用“ProjectTeam()”类的单个相同实例。
  • 对于一个类的单个实例,模式是singleton。但是你所说的“处理一个包含这么多零件的项目”是什么意思?
  • 我的意思是不同的类,不同的成员代表我的示例项目的不同任务和阶段。

标签: c# oop static relationship


【解决方案1】:

您可以在以下项目中为人员使用静态类

public static class Team
{

    public static List<Person> GetPersons()
    {
        var person = new List<Person>();
        person.Add(new Person() { Name = "testPerson" });
        return person;
    }

}
public class Person
{
    public string Name { get; set; }
}
public class Project
{
    public string Name { get; set; }
    public string Scope { get; set; }
    public List<Person> Person
    {
        get
        {

            return Team.GetPersons();
        }
    }
}

【讨论】:

  • 我认为这更接近我对相同实例的想法。谢谢
【解决方案2】:

尝试使用单例。这是模式,众所周知且非常有用。 本质上,单例是一个类,它只允许创建其自身的单个实例,并且通常提供对该实例的简单访问。 实现如下所示:

    public sealed class Singleton
{
    private static Singleton m_oInstance = null;
    private int m_nCounter = 0;

    public static Singleton Instance
    {
        get
        {
            if (m_oInstance == null)
            {
                m_oInstance = new Singleton();
            }
            return m_oInstance;
        }
    }

    public void DoSomething()
    {
        Console.WriteLine("Hello World {0}!", m_nCounter++);
    }

    private Singleton()
    {
        m_nCounter = 1;
    }
}

然后你可以通过这种方式访问​​它:

Singleton.Instance.DoSomething();

【讨论】:

  • 您的单例实现存在缺陷。它不是线程安全的,并且使用了误导性的命名约定。
  • 您可以通过将实例创建移到静态构造函数中来轻松解决线程安全问题。
【解决方案3】:

如果您有 3 个不同的项目要引用 DLL,请执行以下操作:

1 - 在解决方案资源管理器中,在您要在其中使用库的每个项目下...右键单击“引用”节点并单击“添加引用”

2 - 在出现的参考管理器左侧,单击“项目”

3 - 单击库项目的复选框。这会将您的库的引用添加到您要使用该库的项目中。

4 - 现在在您想要使用 ProjectTeam 类的项目中,将其添加到 .cs 文件的顶部:

using MyClassLibrary;

5 - 现在您可以在其中一个函数中添加此代码以使用该 ProjectTeam 类:

ProjectTeam.TeamMembers.Add(new Person......)

6 - 然后研究一下静态函数和非静态函数的区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 2015-04-03
    • 2017-10-20
    相关资源
    最近更新 更多