Как определить тип цели для возвращаемого значения расширения разметки? - PullRequest
1 голос
/ 15 марта 2019

Я пишу пользовательское расширение разметки. В его ProvideValue методе я хотел бы изменить / преобразовать мое возвращаемое значение на основе предполагаемого целевого типа свойства, для которого расширение разметки используется для предоставления значения.

(В основном, TypeConverter знает о целевом типе окружающего связывания и может соответствующим образом адаптировать его поведение; я хотел бы сделать то же самое в моем расширении разметки.)

Теперь метод ProvideValue получает только IServiceProvider в качестве аргумента. Кажется, я должен быть в состоянии использовать его, чтобы получить объект, который предоставляет мне желаемый бит контекстной информации, но до сих пор ни одна из моих попыток сделать это не была полностью удовлетворительной:

  • Я получил реализацию IDestinationTypeProvider. Хотя он, кажется, делает именно то, что мне нужно, основываясь на его имени, к сожалению, он выдает исключение:

    var dtp = (IDestinationTypeProvider)serviceProvider.GetService(typeof(IDestinationTypeProvider));
    var destType = dtp.GetDestinationType(); // NullReferenceException on this line
    
  • Я получил IProvideValueTarget реализацию. Он предоставляет мне целевое свойство, но только как System.Object, поэтому мне кажется, что я должен сам подготовить свой код для обработки различных (?) Видов свойств и получения типа самостоятельно.

Каким образом для расширения разметки можно получить целевой тип?

1 Ответ

1 голос
/ 15 марта 2019

Используйте IServiceProvider, чтобы получить IProvideValueTarget, затем посмотрите на TargetProperty, которое должно (но не обязательно) быть DependencyProperty.

var provideValueTarget = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
var propertyType = (provideValueTarget.TargetProperty as DependencyProperty)?.PropertyType;
// Test propertyType for null

Свойство target также может быть EventInfo, если MarkupExtension используется с событием, или MethodInfo, если оно используется с прикрепленным событием (или, как вы указали в комментариях, PropertyInfo, если используется с обычным свойством).

К сожалению, я думаю, что это единственный способ сделать это. DynamicResourceExtension имеет аналогичные проверки, см. здесь и здесь - если бы был лучший API, я предполагаю, что он будет использовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...