我想克隆一个通用对象并保留其类型。
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)
谢谢你的帮助。
- -编辑 - -
在这种情况下,我最好不要使用泛型。我会拆分数据。
这是我编写的一个函数,它使用反射克隆 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)
我希望这可以帮助某人。
您始终可以将该方法限制为仅接受实现 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)
| 归档时间: |
|
| 查看次数: |
8255 次 |
| 最近记录: |