Простой способ создания клонов - использовать закрытый метод MemberwiseClone
, унаследованный от System.Object
.Преимущество заключается в автоматическом учете полей из производных классов.Т.е. вам не нужно извлекать метод копирования, чтобы он работал.
public class Spell
{
public int castRange;
public Spell ShallowClone()
{
return (Spell)MemberwiseClone();
}
public override string ToString() => $"castRange = {castRange}";
}
public class ManaSpell : Spell
{
public int manaCost;
public override string ToString() => $"castRange = {castRange}, manaCost = {manaCost}";
}
Этот тест ...
Spell spell = new ManaSpell { castRange = 5, manaCost = 10 };
var copy = spell.ShallowClone();
Console.WriteLine(copy);
Console.ReadKey();
... отображает
castRange = 5, manaCost = 10
Вы не можете избежать каста, если вам нужен результат, набранный как ManaSpell
.
Возможное решение, позволяющее избежать кастинга, заключается виспользуйте общий статический метод.Компилятор C # может вывести тип возврата из статического (время компиляции) параметра типа.
public class Spell
{
public int castRange;
public Spell ShallowClone()
{
return (Spell)MemberwiseClone();
}
public override string ToString() => $"castRange = {castRange}";
public static T ShallowClone<T>(T original)
where T : Spell
{
return (T)original.ShallowClone();
}
}
This ...
ManaSpell manaSpell = new ManaSpell { castRange = 6, manaCost = 18 };
ManaSpell manaSpellCopy = Spell.ShallowClone(manaSpell);
Console.WriteLine(manaSpellCopy);
... prints
castRange = 6, manaCost = 18