Кастинг одного объекта к другому типу
-
27-09-2019 - |
Вопрос
У меня есть один класс по имени и один класс B
public class A : UserControl { }
public class B : UserControl { }
Теперь у меня есть одна сборка, функция класса которой принимает объекты класса A. Эта сборка не создана мной, поэтому у меня нет контроля. В основном это 3-я партийная ассамблея.
Но я хочу поставить свои объекты класса B, поскольку это немного настроено. Отдых гарантировал, что он содержит все свойства класса А. Как я могу пописать свой объект класса B, чтобы ввести a, чтобы я мог интегрировать 3-й партийную сборку в моем проекте, а также настроить внешний вид в соответствии с моими потребностями?
Если я так что-то вроде (A)objB
Это не разрешено. Затем я попробовал это:
UserControl control = objB as UserControl;
A objA = control as A;
Но проблема в этом случае - это нуль.
Чтобы избежать путаницы: класс A и сборка предоставляется 3-й партией.
Заранее спасибо :)
Решение
Учитывая свою иерархию, вам придется написать оператор преобразования. Нет встроенного способа сделать это в целом (думаю Dog : Animal
и Cat : Animal
):
public static explicit operator A(B b) {
// code to populate a new instance of A from b
}
Вы также можете использовать общую структуру отражения и сделать что-то вроде
public static void PropertyCopyTo<TSource, TDesination>(
this TSource source,
TDestination destination
) {
// details elided
}
так что тогда вы могли бы сказать
// b is B
// a is A
b.PropertyCopyTo<A>(a);
который будет скопировать все общие свойства между b
к a
.
Другие советы
За B
быть брошенным к A
, B
должен наследовать A
. Отказ Даже если B
содержит все свойства A
, это все еще не A
.
Вы можете использовать шаблон адаптера
Если B нельзя бросить до (как в B is A
) невозможно добиться того, что вы пытаетесь сделать без наследства от A. К сожалению, C # не поддерживает Утка печатает В отличие от многих динамических языков (например, Ruby).
Вы можете наследовать от класса A:
public class B : A {
}
И если вам нужно перераспределить некоторые методы / свойства, просто установили их virtual
в классе А.
Я думаю, что вы на самом деле не можете это сделать.
Почему бы не добавлять свои свойства в частичный класс A?