c#中使用构造函数复制具有不同泛型类型的类

本文关键字:泛型类型 构造函数 复制 | 更新日期: 2023-09-27 18:06:30

我有一个Data<TData, TKey>类,它基本上包装了一个字典。我希望有一个构造函数,它可以接受另一个Data类,复制值,并接受一个新键。

然而,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>,则强制传入类和新类具有相同的类型键。它们可能没有相同类型的键。应该有一种在Data<TData,?>中传递的方法,就像在Java中一样。

c#中使用构造函数复制具有不同泛型类型的类

可能是…

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);