2011-06-20 4 views
6

私は何かしたいが、それを記述する方法がわからない。私はこのクラスC# - MyClass.MyProperty [something]

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

を持っているしかし、私は暗黙のうちにGetPersonByName(「ジョン」)を呼び出す必要があり、この

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

行うことができるようにしたいです。

これは可能ですか? Companyクラスに追加する必要があるのは何ですか?

ありがとうございます!

答えて

7

はい、可能です。あなたは次のように、アクセサクラスを作成する必要があります。

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

これは私が必要なもののように見えます!私はそれをテストする時間がないので、私は今それを受け入れるだろう。あなたの迅速な対応のためにZrutyと皆さんありがとう! – Aximili

+0

パーフェクト!もし私ができるならば、私は+10を与えるだろう、最初の試みで動作する非常に明確な答え、多くのありがとう! – Aximili

2

あなたがこれを行う場合:

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

、あなたはで人を取得することができます:

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

をおc.Persons["John"]をしたい場合は、その後、あなたは、いくつかのあるプロパティ者を定義する必要がありますインデックス付きプロパティが定義されたユーザー定義型。 PersonsプロパティをList型にすることはできますが、Listクラスには文字列を取るインデックス付きプロパティがありません。 GetPerson(string name)というメソッドを使ってみませんか?

+0

ああ...ありがとうございました...だからあなたはc.Persons ["John"]をすることは不可能だと言っていますか? – Aximili

0

あなたは人基礎となる目的が何であれタイプ、この場合はリスト上のインデクサを使用している

Persons["John"]; 

で。

最初のアプローチ:インデクサーをオーバーライドする特別なコレクションリスト(PersonList:Listと言うことができます)を作成することができます。また、次の2つの方法で可能です。コンストラクタ内でCompanyインスタンスを渡すので、オーバーライド実装では顧客インスタンスに問い合わせることができます。

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

第二のアプローチは:あなたが直接Companyクラスのインデクサーを作成し、Cの[「ジョン」]これらのアプローチについて今

のようなものを持っている - >最初のものは私のポイントから良く見えますそれは設計原則に反するからです。 2番目のアプローチで人のためのインデクサーで会社に問い合わせることは本当に素晴らしいことではありません。

関連する問題