1

次のようなデータ コンテナーがある状況があります。

public class DataContainer<T> 
{
    public T GetData { get; private set; }

    public DataContainer(T data)
    {
        this.GetData = data;
    } 
}

しかし残念ながら、これらのコンテナーのリストが必要です。それぞれの汎用パラメーターは実行時まで不明であり、要素ごとに異なる可能性があります。私は最初に次のようなもので実行しようとしました:

IList<DataContainer<dynamic>> containerList = new List<DataContainer<dynamic>>();
containerList.add((dynamic)new DataContainer<int>(4));
containerList.add((dynamic)new DataContainer<string>("test"));

残念ながらこれは機能しません (RuntimeBinderException が発生します)。最初に (DataContainer) へのキャストを試みましたが、そこで InvalidCastException が発生しました。

私の質問には2つの部分があります:

  1. おそらく「動的」を悪用して、必要な動作を取得しようとしていることは理解していますが、上記が機能しない理由を誰かが説明できますか?

  2. この状況にアプローチする最善の方法は何ですか? ダイナミックを DataContainer の「GetData」にプッシュして、非ジェネリック化する必要がありますか?

本当にありがとう!

4

2 に答える 2

3

次のようなことができます。

public interface IDataContainer
{
    object GetData{get;set;}
}

public class DataContainer<T> : IDataContainer
{
    public T GetData { get; private set; }

    object IDataContainer.GetData 
    {
        get { return this.GetData; }
        set { this.GetData = (T)value; }
    }

    public DataContainer(T data)
    {
        this.GetData = data;
    }
}

次に、次のことができます。

IList<IDataContainer> containerList = new List<IDataContainer>();

containerList.Add(new DataContainer<string>("test"));
containerList.Add(new DataContainer<int>(234));
于 2013-11-08T09:00:28.597 に答える