1

オブジェクトをジェネリック BindingList に挿入しようとしました。しかし、特定のオブジェクトを追加しようとすると、コンパイラは次のように言います: 「引数の型 ... はパラメーターの型に割り当てられません」

private void JoinLeaveItem<T>(BindingList<T> collection)
    {

        if (collection.GetType().GetGenericArguments()[0] == typeof(UserInformation))
        {
            var tmp = new UserInformation();
            collection.Add(tmp);
        }
    }

私を助けてください

4

2 に答える 2

1

厳密に型指定されたリストに、共通の祖先を持たない 2 つの異なる型のオブジェクトを含めることはできません。つまり、あなたのケースでは、2 つ (またはそれ以上) のクラスに共通の基本クラスがない限り、異なるコレクションが必要になります。

代わりに、このようにオーバーロードを作成してみてください

private void JoinLeaveItem(BindingList<UserInformation> collection)
{
    collection.Add(new UserInformation());
}

private void JoinLeaveItem(BindingList<GroupInformation> collection)
{
    collection.Add(new GroupInformation());
}

このように使用してください

JoinLeaveItem(userInformationCollection)
JoinLeaveItem(groupInformationCollection)

tmp注:変数をインライン化しました。

于 2012-05-04T08:58:39.803 に答える
0

コメントで説明したことから、このようなことをしたいですか....

private void JoinLeaveItem<T>(BindingList<T> collection)  where T: new()
    { 
            var tmp = new T(); 
            collection.Add(tmp); 
    } 

編集指定した項目のみに制限するために余分なテストを追加する場合は、最初に大きなテストを追加できます

private void JoinLeaveItem<T>(BindingList<T> collection)  where T: new()
    { 
        if (typeof(T) == typeof(UserInformation) || typeof(T) == typeof(GroupInformation) 
            var tmp = new T(); 
            collection.Add(tmp); 
        } 
    } 

または、インターフェイスを使用して、より一般的なソリューションを作成することもできます。

インターフェイスを定義する

public interface ILeaveItem { }

UserInformation と GroupInformation を継承させてから使用する

private void JoinLeaveItem<T>(BindingList<T> collection)  where T: ILeaveItem, new()
    { 
            var tmp = new T(); 
            collection.Add(tmp); 
    } 
于 2012-05-04T09:16:31.607 に答える