Поскольку проблема заключается в том, что вы хотите обеспечить безопасность типов во время компиляции, но не знаете типы до времени выполнения, вы можете отменить решение до времени выполнения с помощью dynamic
.Я не обязательно рекомендую это, просто говорю, что это будет работать.
Я изменил интерфейс Covariant
, чтобы он не обязательно был универсальным, так как он не использовал параметр типа.Я переименовал AddFruit
в SetFruit
, поскольку он ничего не добавил, а заменил.
foreach (var fruit in myFruits) {
foreach (var picture in myPictures) {
if (picture is Covariant cov) {
if (cov.GetFruitType() == fruit.GetType())
((dynamic)picture).SetFruit(Convert.ChangeType((dynamic)fruit, cov.GetFruitType()));
}
}
}
(dynamic
) ChangeType
необходим, поскольку тип fruit
равен Fruit
, который не является допустимым типом для передачи на любой SetFruit
.Он должен быть динамическим, так как статический тип времени компиляции ChangeType
равен object
, что также недопустимо для любого SetFruit
.
В качестве альтернативы, что если вы поместите решение вFruitPicture
?
public interface Covariant {
void SetCompatibleFruit(Fruit f);
}
public class FruitPicture<T> : Picture, Covariant where T : Fruit {
T myFruit = null;
public void SetCompatibleFruit(Fruit f) {
if (f is T tf)
this.myFruit = tf;
}
}
Затем просто попросите каждого Covariant
picture
установить fruit
, если он может:
foreach (var fruit in myFruits) {
foreach (var picture in myPictures) {
if (picture is Covariant cov)
cov.SetCompatibleFruit(fruit);
}
}