克隆一个泛型类型

jn1*_*1kk 3 c# generics

我想克隆一个通用对象并保留其类型。

run.Append(style.Clone(BlackFont)); //run object accepts only RunProperties objects

public T Clone(T what) {
    if (what is RunProperties)
        return (T) what.Clone();
}
Run Code Online (Sandbox Code Playgroud)

它不起作用,因为 T 类型没有 Clone 方法,我怎样才能在没有在第一个语句中进行转换的情况下克服这个问题。

run.Append((RunProperties) style.Clone(BlackFont)); //I do not want this
//not that this will work since you can't convert T to RunProperties
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助。

- -编辑 - -

在这种情况下,我最好不要使用泛型。我会拆分数据。

Ass*_* S. 6

这是我编写的一个函数,它使用反射克隆 T 类型的记录。这是一个非常简单的实现,我没有处理复杂的类型等。

public static T Clone<T>(T original)
{
    T newObject = (T)Activator.CreateInstance(original.GetType());

    foreach (var originalProp in original.GetType().GetProperties())
    {
        originalProp.SetValue(newObject, originalProp.GetValue(original));
    }

    return newObject;
}
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助某人。


Jus*_*ner 5

您始终可以将该方法限制为仅接受实现 ICloneable 接口的类型:

public T Clone(T what) where T : ICloneable
{
    if (what is RunProperties)
        return (T) what.Clone();
}
Run Code Online (Sandbox Code Playgroud)

但由于您的方法实际上仅适用于一种类型,因此您可以稍微更改它并as也使用运算符:

public T Clone(T what)
{
    var castWhat = what as RunProperties;
    if(castWhat != null)
        return castWhat.Clone();
}
Run Code Online (Sandbox Code Playgroud)