В настоящее время у меня есть настройка отображения для преобразования из одного базового класса в другой базовый класс. Я сопоставляю класс клиента стороннему контролю. Значения схожи, но есть достаточно различий, поэтому я не могу использовать сторонний элемент управления.
_converters = new Dictionary<Type, Func<AnnotationBase, AnnotationMark>>();
_converters.Add( typeof( HighlightAnnotation ), ToHighlighterAnnotationMark );
_converters.Add( typeof( RectangleAnnotation ), ToRedactionAnnotationMark );
_converters.Add( typeof( StampAnnotation ), ToTextStampAnnotationMark );
Это работает находка, но в некоторых местах мне приходится делать дополнительный каст. Например:
private AnnotationMark ToTextStampAnnotationMark( AnnotationBase tool )
{
TextStampAnnotationMark mark = new TextStampAnnotationMark();
mark.Location = new MarkLocation { X = (int)tool.Location.X, Y = (int)tool.Location.Y };
mark.Size = new MarkSize { Width = (int)tool.Size.Width, Height = (int)tool.Size.Height };
mark.Text = ((StampAnnotation)tool).Text;
return mark;
}
В этом примере я должен указать, что AnnotationBase
будет StampAnnotation
, что, как я знаю, является правильным, поскольку это тип, зарегистрированный в маппере. Однако я бы хотел изменить сигнатуру этого метода на private TextStampAnnotationMark ToTestStampAnnotationMark( StampAnnotaion )
.
Есть ли способ сделать отображение функции или вести себя так?
Func<TTool,TMark>()
where TTool : AnnotationBase
where TMark : AnnotationMark