Вы не можете сделать это, потому что вы не можете определить List<T>
самостоятельно.Вы сможете сделать это только в том случае, если сможете объявить свой собственный List<T>
из-за способа ограничения ICloneable<T>
.Поскольку List<T>
действительно не реализует ICloneable<T>
, вам нужно будет иметь тип T be InstanceList, который вы делаете можете контролировать.
Вот как вы бы это реализовали:
public class InstanceList : List<Instance>, ICloneable<InstanceList>
{
public InstanceList Clone()
{
// Implement cloning guts here.
}
object ICloneable.Clone()
{
return ((ICloneable<InstanceList>) this).Clone();
}
}
public class Instance
{
}
public interface ICloneable<T> : ICloneable where T : ICloneable<T>
{
new T Clone();
}
Конечно, есть другая альтернатива, которую вы могли бы сделать.Вы можете немного расширить свои дженерики, чтобы создать тип CloneableList<T>
:
public class CloneableList<T> : List<T>, ICloneable<CloneableList<T>>
{
public CloneableList<T> Clone()
{
throw new InvalidOperationException();
}
object ICloneable.Clone()
{
return ((ICloneable<CloneableList<T>>) this).Clone();
}
}
public interface ICloneable<T> : ICloneable where T : ICloneable<T>
{
new T Clone();
}
И если вы действительно хотите стать модным, создайте что-то, что ограничивает T до ICloneable.Тогда вы могли бы реализовать ICloneable в классе Instance и все, что вы хотите включить в список ICloneable<T>
, таким образом обрабатывая каждый CloneableList<T>
точно таким же образом, избегая различной реализации ICloneable<T>
для каждого и каждого клонируемого списка.Вы хотите создать.
public class CloneableList<T> : List<T>, ICloneable<CloneableList<T>> where T : ICloneable
{
public CloneableList<T> Clone()
{
var result = new CloneableList<T>();
result.AddRange(this.Select(item => (T) item.Clone()));
return result;
}
object ICloneable.Clone()
{
return ((ICloneable<CloneableList<T>>) this).Clone();
}
}
public interface ICloneable<T> : ICloneable where T : ICloneable<T>
{
new T Clone();
}