На данный момент это невозможно.
Вы можете добавить необходимые Clone
методы расширения, но сейчас нет никакого способа использовать весь интерфейс.
Помните, что проверка поддержки интерфейса может быть записана в существующем коде, подобном этому:
if (dictionary is ICloneable cloneable)
var clone = cloneable.Clone();
Но это не сработает только с расширением, поскольку базовый тип фактически не реализует интерфейс .
В этой области мысли предпринимаются некоторые усилия:
Я понятия не имею, насколько хорошо им удается получить эти вещи, поэтому, может ли это потенциально решить эту проблему в будущем, немного в воздухе.
Обратите внимание, что вы можете сделать это с помощью художественного оформления, но это может быть немного трудоемким и потребует от вас создания словарей, используя другой тип:
public class CloneableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, ICloneable
{
... methods and properties that delegate to base.XYZ
public object Clone() => new ...
}
Везде, где вы строите свой объект, вы должны будете написать это:
var dictionary = new CloneableDictionary<...>();
вместо:
var dictionary = new Dictionary<...>();
Поскольку CloneableDictionary
наследует Dictionary
, вы можете поместить его в переменные и параметры, которые уже существуют, даже если их тип сохраняется как Dictionary<...>
, но если вы забудете, что действительно храните в нем другие типы словарей и создавать новые, нормальные, не клонируемые словари, в некоторых местах они могут быстро упасть.