Код для преобразования одного класса в другой (я полагаю, вы говорите о преобразованиях во время выполнения), возможно, не является необходимым способом.Например, если у вас есть класс X и класс Y, каждый из которых имеет void Blah()
, который вы хотите вызвать из метода C, и метод C принимает X в качестве параметра, вместо этого вы можете извлечь общий интерфейс для X и Y итогда пусть C примет интерфейс вместо этого.Поэтому ваш Y может оставаться Y.
Другой вариант - использовать шаблон адаптера , который может привести Y в соответствие с извлеченным интерфейсом X, и это особенно полезно, если Y имеет те же общиефункциональность, но под другим именем, или если изменение кода одного из классов является болезненным, невозможным или просто нежелательным.
Пример, приведенный
interface ICanBlah { void Blah(); }
class X : ICanBlah { public void Blah() { } }
class Y { public void Blahhhhh() { } }
Вы можете написать
public class YBlahAdapter : ICanBlah
{
Y itsY;
public YBlahAdapter(Y y) { itsY = y; }
public void Blah() { itsY.Blahhhhh(); }
}
Поэтому, где бы у вас ни был метод, который принимает ICanBlah
, и у вас есть объект типа Y
, вы можете обернуть его в адаптер, а затем передать адаптер в метод.
С другой стороны, если вы действительно хотите выполнить преобразование во время выполнения X в Y или Y в X, вы можете определить операторы неявного или явного преобразования для одного или обоих.
public static explicit operator Y(X x) { /* build and return Y from X */ }
(Этот оператор должен быть объявлен в исходном файле одного из типов.)