2011-06-20 8 views
6

Chcę coś zrobić, ale nie wiem, jak to opisać. Mam tej klasyC# - MyClass.MyProperty [coś]

public class Company { 
    private List<Person> _persons; 
    private Person GetPersonByName(string name) { 
    // My code to select Person is here, which is fine 
    } 
} 

Ale chcę, aby móc to zrobić

Company c; 
Person p = c.Persons["John"]; 

które powinny pośrednio wywołać GetPersonByName ("John").

Czy to możliwe? Co muszę dodać do klasy firmy?

Z góry dziękuję!

Odpowiedz

7

Tak, jest to możliwe. Trzeba utworzyć klasę dostępowej, jak następuje:

public class Company 
{ 
    private List<Person> _persons; 
    public class PersonsIndexer 
    { 
     Company _owner; 
     public PersonsIndexer(Company owner) 
     { 
      _owner = owner; 
     } 
     public Person this[string name] 
     { 
      get 
      { 
       return _owner._persons.FirstOrDefault(x=>x.Name == name); // or whatever code you have there 
      } 
     } 
    } 

    public PersonsIndexer Persons{ get; private set; } 

    public Company() 
    { 
     Persons = new PersonsIndexer(this); 
    } 

} 
+0

To wygląda na to, czego potrzebuję! Nie mam czasu, żeby to przetestować, więc przyjmuję to teraz. Dziękuję Zruty i wszystkim za szybkie odpowiedzi! – Aximili

+0

Idealny! Dałbym +10, gdybym mógł, bardzo jasną odpowiedź, która działa przy pierwszej próbie, wielkie dzięki! – Aximili

2

Jeśli to zrobić:

public class Company 
{ 
    private List<Person> _persons; 
    private Person GetPersonByName(string name) 
    { 
     // My code to select Person is here, which is fine 
    } 

    public Person this[string name] 
    { 
     get { return GetPersonByName(name); } 
    } 
} 

następnie można uzyskać osoba przez:

Company c; 
Person p = c["John"]; 

Jednak jeśli chcesz c.Persons["John"], to trzeba zdefiniować własność osób, którą niektóre typ zdefiniowany przez użytkownika, który ma zdefiniowaną własność indeksowaną. Właściwość Persons może być typu List, ale wtedy klasa List nie ma właściwości indeksowanej, która pobiera ciąg znaków. Dlaczego po prostu nie używasz metody GetPerson(string name)?

+0

ah ... dziękuję za to ... Więc mówisz, że nie da się zrobić c. Pracowników ["John"]? – Aximili

0

Z

Persons["John"]; 

używasz podziałowe na cokolwiek typ osób bazowego obiektu, jest w tym przypadku na liście. To, czego chcesz, jest możliwe na dwa sposoby, a prawdopodobnie jeszcze więcej, ale to są moje pomysły w tej chwili:

Pierwsze podejście: możesz utworzyć specjalną kolekcję Lista (powiedzmy Lista osobista: Lista), która zastąpi indeksator, oraz w konstruktorze przekazuj instancję Company, aby w implementacji override można było zapytać o instancję klienta.

public class PersonList: List<Person> 
{ 
    public new Person this[string name] 
    { 
     get 
     { 
      return company.GetMyPerson(name); 
     } 
    } 
} 

Drugie podejście: utworzyć podziałowe na klasy Spółki bezpośrednio i mieć coś takiego c [ „John”]

Teraz o tych podejść -> Pierwszy z nich wygląda lepiej z mojego punktu widzenia, ponieważ narusza to mniej zasad projektowania. Zapytanie firmy z indeksem dla osób w drugim podejściu nie jest naprawdę miłe ...

Powiązane problemy