C# 访问MarkupExtension.ProvideValue中的构造函数参数

C# 访问MarkupExtension.ProvideValue中的构造函数参数,c#,wpf,xaml,.net-4.0,C#,Wpf,Xaml,.net 4.0,我有一个MyListYExtension标记扩展,它没有默认构造函数。因此,只能使用构造函数语法创建它。 另一个GetValueExtension标记扩展尝试确定所请求值的目标类型,以便进行必要的转换。例如,如果将第二个扩展名的值赋给Double类型的属性,则GetValueExtension会理解它并返回2.0而不是“2”。虚拟示例: {MyListX Capacity={GetValue ListCapacityParam}} 如果我将GetValueExtension指定给属性,

我有一个MyListYExtension标记扩展,它没有默认构造函数。因此,只能使用构造函数语法创建它。 另一个GetValueExtension标记扩展尝试确定所请求值的目标类型,以便进行必要的转换。例如,如果将第二个扩展名的值赋给Double类型的属性,则GetValueExtension会理解它并返回2.0而不是“2”。虚拟示例:

{MyListX Capacity={GetValue ListCapacityParam}}    
如果我将GetValueExtension指定给属性,一切都会正常进行。然后可以通过访问MarkupExtension.ProvideValue中的目标类型

但当我将GetValueExtension作为MyListYExtension构造函数的参数应用时,TargetProperty为null:


{MyListY{GetValue ListCapacityParam}}
当XAML解析器为属性赋值时,它将执行默认转换。 但当它从标记扩展中获取值时,它不会这样做。它会导致异常,无法将字符串值等指定给double属性。 为了避免这种情况,我尝试模拟默认转换,但为此需要知道目标类型

我在MarkupExtension.ProvideValue调用中找不到任何解决方法来确定构造函数参数的实际类型

我可以修改GetValueExtension,但不能修改MyListYExtension


我能做些什么来解决这个问题呢?

看起来像是鸡和蛋的问题。问题是构造函数可以重载,为了找到合适的构造函数,框架需要知道您试图传递给它的参数的类型


换句话说,在调用
ProvideValue
时,不知道将使用什么构造函数,因此无法提供有关目标类型的信息。

从概念上讲,这是正确的,您是对的。注意:有一个属性默认为“false”,默认实现目前不支持将其设置为“true”。这意味着他们可以确定arity所需的构造函数(它接受的参数数量),从而确定扩展的目标类型。但这样一来,它可能会成为未来支持重复计算的障碍(提到的鸡和蛋)。
((IProvideValueTarget)serviceProvider).TargetProperty.PropertyType
<!-- no default constructor in MyListY -->
<!-- the first parameter of MyListY is "int capacity" -->
{MyListY {GetValue ListCapacityParam}}