2015-09-23 2 views
0

Я определил класс, который имеет List<>. Я сократил свой Кодекс. Он слишком велик. Слишком много List<> & в Method1() есть много кода. Вот мой код: -C# - Инициализировать список <> из другого класса

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(); 
} 

Но Setts1 не показывает никаких записей, когда в Method1. Как инициализировать List<> из другого класса?

+0

'Setts1', похоже, заполнен внутри метода' LoadSettings1', и вы не вызываете этот метод внутри своего 'класса' (последний фрагмент в вопросе). что вызывает проблему? –

+0

Я не могу вызывать 'LoadSettings1' из другого класса. Поэтому я хочу инициализировать его из вызывающего класса. – Anup

+0

Почему бы не позвонить? Это потому, что у вас нет идентификатора компании на улице? – tomab

ответ

2

Публикация Поле Члены класса, вне класса, не являются хорошей практикой. Поэтому я рекомендую использовать свойства так:

//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 свойство внутри класса или за его пределами, он будет инициализирован на правильное время.

+0

Ему нужен конструктор для инициализации companyId. –

+0

Это образец, не являющийся точным решением его проблемы, поскольку он сказал, что существует более 3000 строк кода. поэтому мы можем просто сказать: 'ctx.tblSett1' должен быть инициализирован раньше (например, в конструкторе). Но, по словам его «LoadSettings1», кажется, что его главная проблема не в этом, и я рекомендую его для остальной части проблемы. –

1

Вы должны позвонить 'LoadSettings1 (int companyId)'. Это метод, который приносит записи и заполняет ваш «список».

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

    public Something(int companyId) 
    { 
     cls.LoadSettings1(companyId); 
    } 

    public void CallMethod1() 
    { 
     cls.Method1(); 
    } 
} 

Что-то вроде этого? Использование конструктора для вашего «другого класса» для LoadSettings.

0
cls.Setts1 = ....; 

На самом деле я не вижу, как ваш код не будет работать, даже если, как сказал Хосейн, это плохая практика. Посмотрите, как вы устанавливаете cls.Setts1 (часть ....). Скорее всего, виновник

Смежные вопросы