【问题标题】:c# - Initialize List<> from another classc# - 从另一个类初始化 List<>
【发布时间】:2015-09-23 05:15:32
【问题描述】:

我定义了一个具有List&lt;&gt; 的类。我已经缩短了我的代码。它太大了。 List&lt;&gt;& 中有太多 Method1() 中有很多代码。这是我的代码:-

 public class Time : ITime
 {
        public List<Table1> Setts1 = new List<Table1>();
        public List<Tabl2> Setts2 = new List<Table2>();

        public void LoadSettings1(int companyId)
        {
            Setts1 = ctx.tblSett1.Where(a => a.CompanyId == companyId).Select(a => a).ToList();
        }



       public double Method1()
       {
          var data = Setts1.Where(m => m.SetType == "TYPE1").Select(m => m.Value1).FirstOrDefault();
          ......
          ......
       }

     }

我想在另一个班级使用Method1()。我的问题是Setts1,它预装在Time 类中。因此,当它在Time 类中使用时,它具有Records。但是当我从另一个班级调用它时,显然Setts1 将没有记录。我试图从另一个这样的类初始化它:-

public class Class
{
   .....
   Time cls = new Time();
   cls.Setts1 = ....;
   cls.Method1();
}

但是Setts1Method1 中时没有显示任何记录。如何从另一个类初始化List&lt;&gt;

【问题讨论】:

  • Setts1 似乎已在方法 LoadSettings1 中填充,并且您没有在 Class 中调用此方法(最后一个 sn-p 有问题)。这会导致问题吗?
  • 我无法从另一个班级呼叫LoadSettings1。所以我想从调用类初始化它。
  • 为什么不能调用呢?是因为你在外面没有公司id吗?
  • 因为LoadSettings1 有很多其他类不需要的东西。 List&lt;&gt; 不止一个,还有很多。代码3000多行。
  • 如果情况如此,那么您必须自己弄清楚如何初始化您的列表,因为我们无法猜测您的庞然大物类中还有什么其他东西。

标签: c# asp.net-mvc class oop


【解决方案1】:

在类之外公开类的字段成员不是一个好习惯。所以我建议像这样使用 properties

//Mark the field member as private
private List<Table1> _Setts1 = new List<Table1>();

//Use Property to access the field outside of the class
public List<Table1> Setts1
{
    get
    {
        if (_Setts1==null || _Setts1.Count()==0) //or any other logic you need
        {   
            //Initialize the field memeber
            _Setts1 = ctx.tblSett1.Where(a => a.CompanyId == companyId).Select(a => a).ToList();
        }

        return _Setts1
    }
}

这样你就可以忘记LoadSettings1之类的方法,不管你在类内部还是外部使用Setts属性,它都会在正确的时间被初始化。

【讨论】:

  • 他也需要一个构造函数来初始化companyId。
  • 这是一种模式,不能完全解决他的问题,因为他说有超过 3000 行代码。所以我们可以说ctx.tblSett1必须在之前初始化(例如在构造函数中)。但根据他的LoadSettings1 看来,他主要关心的不是这一点,我建议他解决剩下的问题。
【解决方案2】:

您必须调用“LoadSettings1(int companyId)”。这是带来记录并填充您的“列表”的方法。

public class Class
{
    .....
   Time cls = new Time();
   cls.LoadSettings1(1);
   cls.Setts1 = ....;
   cls.Method1();
}

【讨论】:

    【解决方案3】:
    public class Something
    {
       private Time cls = new Time();
    
       public Something(int companyId)
       {
          cls.LoadSettings1(companyId);
       }
    
       public void CallMethod1()
       {
          cls.Method1();
       }
    }
    

    这样的?将“其他类”的构造函数用于 LoadSettings。

    【讨论】:

      【解决方案4】:
      cls.Setts1 = ....;
      

      实际上,我看不出您的代码是如何工作的,即使正如 Hossein 所说,这是一种不好的做法。查看您如何设置 cls.Setts1 ( .... 部分)。这很可能是罪魁祸首

      【讨论】:

        猜你喜欢
        • 2021-11-26
        • 2022-06-10
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 2016-05-26
        • 1970-01-01
        相关资源
        最近更新 更多