4

私が作成したクラスがあります。クラスがコレクション初期化子を持つことができるようにしたいと思います。クラスの例を次に示します。


public class Cat
{
    private Dictionary catNameAndType = new Dictionary();

    public Cat()
    {

    }

    public void Add(string catName, string catType)
    {
        catNameAndType.Add(catName,catType);
    }

}

クラスで次のようなことができるようにしたいと思います。


Cat cat = new Cat()
{
    {"Paul","Black"},
    {"Simon,"Red"}
}

辞書やリストではないクラスでこれを行うことは可能ですか?

4

3 に答える 3

12

メソッドに加えてAdd、クラスはインターフェイスも実装する必要がありIEnumerableます。

参照:オブジェクトとコレクションの初期化子 (C# プログラミング ガイド)

于 2011-10-25T20:41:50.157 に答える
1

はい、他の回答で述べたように(詳細を説明するためだけに)、実装IEnumerable<T>していくつかのAdd()メソッドを用意するだけです:

// inherit from IEnumerable<whatever>
public class Cat : IEnumerable<KeyValuePair<string,string>>
{
    private Dictionary<string, string> catNameAndType = new Dictionary<string, string>();

    public Cat()
    {

    }

    // have your Add() method(s)
    public void Add(string catName, string catType)
    {
        catNameAndType.Add(catName, catType);
    }

    // generally just return an enumerator to your collection
    public IEnumerator<KeyValuePair<string, string>> GetEnumerator()
    {
        return catNameAndType.GetEnumerator();
    }

    // the non-generic form just calls the generic form
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
于 2011-10-25T20:46:52.413 に答える
1

はい、可能です。実際、あなたはほとんどそれを自分で解決しました。そのようなコレクション初期化子を使用するための要件は、Add2 つのメソッド (あなたが持っている) を取るメソッドであり、型が IEnumerable を実装することです (これはありません)。したがって、コードを機能させるには; 次のようなものを使用します。

public class Cat : IEnumerable<KeyValuePair<string,string>>
{
    private Dictionary<string,string> catNameAndType = new Dictionary<string,string>();

    public Cat()
    {

    }

    public void Add(string catName, string catType)
    {
        catNameAndType.Add(catName,catType);
    }

    public IEnumerator<KeyValuePair<string,string>> GetEnumerator() 
    {
        return catNameAndType.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator() 
    {
        return GetEnumerator();
    }
}
于 2011-10-25T20:45:10.153 に答える