使用构造函数在C#中复制具有不同通用类型的类

时间:2011-08-23 14:33:42

标签: c# generics

我有一个基本包裹字典的Data<TData, TKey>类。我想有一个构造函数,可以采取另一个数据类,复制值,并获取一个新的密钥。

但是,C#泛型似乎阻止我这样做,因为Data类不必具有相同类型的键。我所关心的只是复制值,然后使用新密钥作为字典。

public class Data<TData, TKey>
{
    private Dictionary<TKey, List<TData>> keyedData;
    public delegate TKey Key(TData row);

    public Data(Data<T,K> data, Key keyDelegate, string keyName)
            : this(data.Values, keyDelegate, keyName)
    {   
    }
}

当然,Data<T,K>不起作用。但是,如果构造函数采用Data<TData, TKey>,则它会强制传入的类和新类具有相同的类型键。他们可能没有相同的类型密钥。应该有一种方法可以像在Java中那样传入Data<TData,?>

1 个答案:

答案 0 :(得分:2)

也许就像......

public interface IData<TData>
{
    IEnumerable<TData> Values { get; }
}

public class Data<TData, TKey> : IData<TData>
{
    private Dictionary<TKey, List<TData>> keyedData;
    public delegate TKey Key(TData row);

    public Data(IData<TData> data, Key keyDelegate, string keyName)
            : this(data.Values, keyDelegate, keyName)
    {
        //...
    }
}

或者,你可以制作一个真正的通用方法来处理它。

public class Data<TData, TKey>
{
    //...

    public void Populate<TOtherKey>(Data<TData, TOtherKey> otherData)
    {
        // copy otherData.Values into my values
    }
}

然后消费者会做类似的事情:

Data<DataType, Key1> data1 = new Data<DataType, Key2>(/*blah blah*/);
Data<DataType, Key2> data2 = new Data<DataType, Key2>(/*blah blah*/).Populate(data1);