0

私はしばらくの間、誰かがこれに近いことをしようとしているかどうかを調べていましたが、一般的に型付けされたリストを操作しようとしている人がたくさんいるのを見つけました。代わりに、一般的に型付けされた複雑なオブジェクトのリストと対話する必要があります。これが現在のコードです。

public class RequestBundleItem<T> where T : BaseJsonResponseMessage
{
    public T Response { get; private set; }

    //intializers - code not needed

    public void SetResponse(String jsonResponse)
    {
        Response = (T)jsonResponse.JsonToObject<T>();
    }
}

public class RequestBundleManager
{
    private List<RequestBundleItem<T>> BundleItems;

    public async Task<List<RequestBundleItem<T>>> ProcessItemsAsync()
    {
        List<Task<JsonValueEventArgs>> tasks = //create tasks from bundleitems;

        for (var i = 0; i < tasks.Count(); i++)
        {
            Task<JsonValueEventArgs> curTask = tasks[i];
            var args = await curTask;

            BundleItems[i].SetResponse(args.ValueAsText);

        }

        return BundleItems;
    }

    public void AddItem<T>(RequestBundleItem<T> newItem) where T : BaseJsonResponseMessage
    {
        BundleItems.Add(newItem);
    }
}

この行が問題の原因です

private List<RequestBundleItem<T>> BundleItems;

T はジェネリックであり、BaseJsonResponseMessage を実装する必要があるだけなので、このリストを定義する方法がわかりませんが、RequestBundleManager 自体を入力したくありません。

解決:

RequestBundleItem からジェネリックを削除することになり、消費者は必要な応答タイプを知る責任があります。

4

2 に答える 2

1

次のようにリストを定義しますRequestBundleManager

private List<RequestBundleItem<BaseJsonResponseMessage>>

にタイプをRequestBundleManager指定しない場合、リスト内のオブジェクトの特定のタイプは、それがBaseJsonResponseMessage. その場合、そのように定義するだけで意味があります。ただし、定義されているメソッドにのみアクセスできますBaseJsonResponseMessage

それだけでは不十分な場合は、 でアクセスしたいすべてのメソッドを含むインターフェイスを定義し、RequestBundleManagerそれを の型の制約として配置することを検討してくださいRequestBundleItem。このようなもの:

public class RequestBundleItem<T> where T : BaseJsonResponseMessage, IMyInterface

次に、リストを次のRequestBundleManagerように定義します。

private List<RequestBundleItem<IMyInterface>>
于 2013-11-08T18:55:58.087 に答える