2016-04-26 2 views
0

У меня есть два класса A и B. Класс A имеет экземпляр класса B. Класс A имеет список классов Foo с атрибутами Id и Name, который является динамическим. Когда вызывается метод Run класса B, вычисляется локальная переменная id в классе B. Предположим, что значение id равно 2, мне нужно найти dynamicList и получить «Two» назад.Как общаться между двумя классами в C#?

dynamicList может быть изменен сообществом.

class Foo() 
{ 
    public Foo(int id, string name) 
    { 
     this.Id = id; 
     this.Name = name; 
    } 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

class A 
{ 
    public A() 
    { 
     this.dynamicList.Add(new Foo(1, "One")); 
     this.dynamicList.Add(new Foo(2, "Two")); 
     this.dynamicList.Add(new Foo(3, "Three")); 

     b = B(); 
     b.Run(); 
    } 
    public List<Foo> dynamicList = new List<Foo>(); 
} 

class B 
{ 
    public void Run() 
    { 
     while(true) 
     { 
      int id; 
      string name; 

      // an event appended this.dynamicList.Add(new Foo(4, "Four")); 
      // an event appended this.dynamicList.Add(new Foo(5, "Five")); 


      // some code goes here that gets the value of id 4 
      id = 4; 

      // I need to convert the value of '4' to 'Four' 
     } 
    } 
} 

У меня есть два класса A и B. Класс A имеет экземпляр класса B. Класс A имеет список классов Foo с атрибутами Id и Name, который является динамическим. Когда вызывается метод Run класса B, вычисляется локальная переменная id в классе B. Предположим, что значение из id - это 2, мне нужно найти dynamicList и получить «Два» назад.

class Foo() 
{ 
    public Foo(int id, string name) 
    { 
     this.Id = id; 
     this.Name = name; 
    } 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

class A 
{ 
    public A() 
    { 
     this.dynamicList.Add(new Foo(1, "One")); 
     this.dynamicList.Add(new Foo(2, "Two")); 
     this.dynamicList.Add(new Foo(3, "Three")); 

     b = B(); 
     b.Run(); 
    } 
    public List<Foo> dynamicList = new List<Foo>(); 
} 

class B 
{ 
    public void Run() 
    { 
     while(true) 
     { 
      int id; 
      string name; 

      // some code goes here that gets the value of id 2 
      id = 2; 

      // I need to convert the value of '2' to 'Two' 

     } 
    } 
} 
+1

изменить свой метод Выполнить, чтобы принять параметр Список . затем передайте его, когда вы вызываете метод. –

+0

Вам следует избегать публичных переменных. Вместо этого используйте свойство для этого. – chris579

+0

Почему бы вам просто не указать экземпляр A в B в конструкторе B, или нужен только список, просто передайте список. Или еще лучше, изучите зависимость, создайте интерфейс для службы динамического списка B и введите интерфейс в конструктор B. В A вы создаете экземпляр реального исполнителя и передаете его B. B. имеет только зависимость от интерфейс, а не так. –

ответ

0

Вы можете создать вспомогательный класс со значениями и получить значения из него.

public static class ValueHelper 
{ 
    public static string GetValue(int i) 
    { 
     ... 
    } 
} 

И в B:

strint value = ValueHelper.GetValue(2); 
0

Есть несколько способов реализации этого.

1 - через параметры.

b.Run(dynamicList); 

Затем запустите поиск по методу запуска.

public void Run() 
{ 
    while(true) 
    { 
     int id; 
     string name; 
     // some code goes here that gets the value of id 2 
     id = 2; 
     var item = dynamicList.FirstOrDefault(x => x.Id == id); 
     // reference System.Linq 
    } 
} 

Вторым было бы предоставление делегата по параметру.

b.Run(id => dynamicList.FirstOrDefault(x => x.Id == id)) 

Сделайте свой код, как это на ходу

public void Run(Func<int, Foo> getItem) 
{ 
    while(true) 
    { 
     int id; 
     string name; 
     // some code goes here that gets the value of id 2 
     id = 2; 
     var item = getItem(id); 
     // reference System.Linq 
    } 
} 

Есть много других способов сделать это, это всего лишь примеры того, как сделать это с минимальными изменениями в коде, вы можете также рассмотрите изменения в дизайне для дальнейшего улучшения вашего процесса.

+0

Как получить значение, если какие-либо изменения происходят в списке во время запуска метода «Выполнить»? Я снова отредактировал сообщение, проверьте изменения. – srekcahrai

0

Просто измените подпись B.Бегите к этому:

public void Run(A a) 

Тогда вы можете легко передать список с вызовом метода:

b.Run(this) 

список можно получить с

a.dynamicList 
+0

Как получить значение, если какие-либо изменения происходят в списке во время запуска метода «Выполнить»? Я снова отредактировал сообщение, проверьте изменения. – srekcahrai

+0

Я отредактировал свой ответ, чтобы он соответствовал вашим целям. – chris579

+0

Что делать, если 'public List dynamicList = новый Список ();' является частным? – srekcahrai

0

Вы должны сделать параметр dynamicList Класс B

public class Foo() 
{ 
    public Foo(int id, string name) 
    { 
     this.Id = id; 
     this.Name = name; 
    } 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class A 
{ 
    B b = null; 
    public A() 
    { 
     this.dynamicList.Add(new Foo(1, "One")); 
     this.dynamicList.Add(new Foo(2, "Two")); 
     this.dynamicList.Add(new Foo(3, "Three")); 

     b =new B(); 
     b.Run(dynamicList); 
    } 
    public List<Foo> dynamicList = new List<Foo>(); 
} 

public class B 
{ 

    public void Run(List<Foo> DynamicList) 
    { 
     Foo foo = null; 
     while(true) 
     { 
      foo = DynamicList[0]; 
      int id = foo.Id; 
      string name = foo.Name; 

      //here you can add your logic.. 
      // it may be foreach loop or something else.. 
      //and iterate all List in DynamicList 

      // some code goes here that gets the value of id 2 
      id = 2; 

      // I need to convert the value of '2' to 'Two' 

     } 
    } 
} 
+0

Как получить значение, если какие-либо изменения происходят в списке во время работы метода «Выполнить»? Я снова отредактировал сообщение, проверьте изменения. – srekcahrai

+0

Итак, вы должны сделать метод run статическим, а не любым классом .. и вы его вызываете, или вы можете вызвать метод запуска каждый раз, когда вы меняете или обновляете List. –

0
Add the parameter List<Foo> dynamicList in Run method and pass the List from the caller class constructor A(). 
class Foo() 
{ 
    public Foo(int id, string name) 
    { 
     this.Id = id; 
     this.Name = name; 
    } 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

class A 
{ 
    public A() 
    { 
     this.dynamicList.Add(new Foo(1, "One")); 
     this.dynamicList.Add(new Foo(2, "Two")); 
     this.dynamicList.Add(new Foo(3, "Three")); 

     b = B(); 
     b.Run(dynamicList); 
    } 
    public List<Foo> dynamicList = new List<Foo>(); 
} 

class B 
{ 
      public void Run(List<Foo> dynamicList) 
    { 
     while(true) 
     { 
      int id; 
      string name; 

      var data= dynamicList.FirstOrDefault(x=>x.Id==2); 
      id=data.Id; 
      //id = 2; 
      var two= dynamicList.FirstOrDefault(x=>x.Id==2).Select(x=>x.Name); 
      // I need to convert the value of '2' to 'Two' 

     } 
    } 
} 

Надеюсь, это то, что вы ожидаете.