0

次のように設定されたクラスがあるとします。

public abstract class GenericCustomerInformation
{
    //abstract methods declared here
}

public class Emails : GenericCustomerInformation
{
    //some new stuff, and also overriding methods from GenericCustomerInformation
}

public class PhoneNumber : GenericCustomerInformation
{
    //some new stuff, and also overriding methods from GenericCustomerInformation
}

//and more derivative classes for emails, addresses, etc ..

次に、特定のリストを返すこの関数があります。

public List<GenericCustomerInformation> GetLists<T>()
{
    if (typeof(T) == typeof(Alias))
    {
        return aliases.Cast<GenericCustomerInformation>().ToList();
    }

    if (typeof(T) == typeof(PhoneNumber))
    {
        return phoneNumbers.Cast<GenericCustomerInformation>().ToList();
    }
    // .. and the same for emails, addresses, etc ..
}

ここで、関数を 1 つだけ使用してこれらのリストに追加したいとします。

public void AddToList<T>(T iGenericCustomerInformation)
{
    GetLists<T>().Add((T)(object)iGenericCustomerInformation); //Doesn't work as intended. GetLists<T> seems to be returning lists as value, which is why any additions 
}

問題は、AddToList<T>意図したとおりに機能しないことです。GetLists<T>リストを値として返しているようです。これが、私が行った追加がプライマリリスト構造に反映されていない理由です...

では、その参照を使用して他の関数を介してリストの追加を行うことができるように、リストを参照として返す方法は?

4

2 に答える 2

1

これらすべてのtypeof()s とifステートメントを使用することで、ジェネリックのポイントをすでに打ち負かしています。それはまったく一般的ではありません。ifメソッドにステートメントを入れてAddToList()、ジェネリックを修正するだけだと思います。

public void AddToList(GenericCustomerInformation item)
{
    Alias aliasItem = item as Alias;
    if(aliasItem != null)
    {
        aliases.Add(aliasItem);
        return;
    }

    PhoneNumber phoneNumberItem = item as PhoneNumber;
    if(phoneNumberItem != null) 
    {
         phoneNumbers.Add(phoneNumberItem);
    }
}
于 2013-02-10T16:32:12.460 に答える
0

すべてのリストをリストの辞書に入れてみませんか?

private Dictionary<Type, List<GenericCustomerInformation>> MyLists;

public List<GenericCustomerInformation> GetLists<T>()
{
    return MyLists[typeof(T)];
}

public void AddToLists<T>(GenericCustomerInformation item)
{
    GetLists<T>().Add(item);
}
于 2013-02-11T14:07:54.863 に答える