#c# #generics #casting
Вопрос:
Я пытаюсь создать пул универсальных средств, который будет принимать любой объект, если он поддерживает сериализацию(рабочую) или объекты, поддерживающие IClonable. Проблема, с которой я столкнулся, заключается в том, что IClonable необходимо вернуть к типу шаблона. Но он не справляется с кастингом во время выполнения, есть идеи?
private void AddClones(int numberToAdd)
{
for (int x = 0; x < numberToAdd; x )
if (typeof(T).IsSerializable)
{
pool.AddFirst(DeepCopy(objectToClone));
}
else
{
ICloneable myclone = (ICloneable)objectToClone;
pool.AddFirst((T)myclone.Clone()); // fails here
}
}
Исключением является
Система.Исключение InvalidCastException: Система «Невозможно привести объект типа».Объект» для ввода «.Класс». » Я проверил с помощью отладчика, и код правильно создает myclone, он просто не будет изменять тип шаблона T. Есть ли какие-нибудь хорошие обходные пути?
Комментарии:
1. ICloneable. Клонирование гарантирует только то, что возвращаемое значение равно
object
. Подумайте о проверке, чтобы убедиться, что клонированный объект действительно относится к типуT
сif(myclone.Clone() is T isClone) pool.AddFirst(isClone);
или чему-то подобному, иначе у нас не будет много информации, по которой можно было бы дать совет, поскольку мы не видим связанных классов