gpt4 book ai didi

c# - 测试泛型类型是否支持 ICloneable

转载 作者:太空宇宙 更新时间:2023-11-03 19:52:07 26 4
gpt4 key购买 nike

我有一个名为 ValueFrequency 的结构,它作为一个结构开始其生命周期(出于统计原因),您可以在其中存储一个 (double) 值和一个 (int) 频率(说明该值在一组数据中出现的次数. 例如,如果您有一个包含以下值的列表/数组:1,1,1,2,2,3,4,4,4,4,4 它可以存储为 ValueFrequency 的列表/数组:(1 ,3),(2,2),(3,1),(4,5).

无论如何我发现我可以使用泛型而不是硬编码我的结构来使用 double ,所以我可以将它与其他数据类型一起使用(例如,一个点,当使用它来存储二维数据集中的数据时).

结构的简化版本:

public struct ValueFrequency<T> : IComparable, ICloneable where T : IComparable
{
public T value;
public int Frequency;
}

我的问题是我想将此结构与支持 ICloneable 和 ValueTypes(如 double)的结构/类一起使用。我将如何编写一个复制构造函数(从另一个 ValueFrequncy 复制它的字段),如果结构/类支持 IClonable,它将简单地分配相同的值(如果类型是 ValueType)或克隆:

public ValueFrequency(ValueFrequency<T> valueFrequency)
{
if (typeof(T).IsValueType)
this.Value = valueFrequency.Value;
else if (T is supporting IClonable) // pseudo-code ???
this.Value = (T)valueFrequency.Value.Clone();
else
throw new Exception("T must be ValueType or IClonable") ;
this.Frequency = valueFrequency.Frequency;
}

如您所见,我的问题是测试 T 是否可 IClonable,以及实际克隆(将 T 类型转换为 IClonable 以执行克隆)。

最佳答案

您是否关心类型实现了ICloneable,还是只关心底层对象是一个ICloneable

else if (valueFrequency.Value is ICloneable) 
this.Value = (T)((ICloneable)valueFrequency.Value).Clone();

关于c# - 测试泛型类型是否支持 ICloneable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37688854/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com