デフォルトのコンストラクターがないMyListYExtensionマークアップ拡張機能があります。したがって、コンストラクタ構文でのみ作成できます。別のGetValueExtensionマークアップ拡張機能は、必要な変換を実行できるように、要求された値のターゲットタイプを判別しようとします。たとえば、2番目の拡張機能の値をDouble型のプロパティに割り当てると、GetValueExtensionはそれを理解し、「2」ではなく2.0を返します。ダミーの例:
{MyListX Capacity={GetValue ListCapacityParam}}
GetValueExtensionをプロパティに割り当てると、すべてうまくいきます。次に、MarkupExtension.ProvideValue内でターゲットタイプにアクセスできます。
((IProvideValueTarget)serviceProvider).TargetProperty.PropertyType
しかし、MyListYExtensionのコンストラクターのパラメーターとしてGetValueExtensionを適用すると、TargetPropertyはnullになります。
<!-- no default constructor in MyListY -->
<!-- the first parameter of MyListY is "int capacity" -->
{MyListY {GetValue ListCapacityParam}}
XAMLパーサーがプロパティに値を割り当てるとき、デフォルトの変換を実行します。ただし、マークアップ拡張から値を取得する場合は実行されません。たとえば、文字列値をdoubleプロパティに割り当てることができないという例外が発生します。これを回避するために、デフォルトの変換をエミュレートしようとしますが、そのためにはターゲットタイプを知っている必要があります。
MarkupExtension.ProvideValue呼び出し内のコンストラクターパラメーターの実際のタイプを判別するための回避策が見つかりません。
GetValueExtensionは変更できますが、 MyListYExtensionは変更できません。
これを解決するにはどうすればよいですか?