我有 MyListYExtension 没有默认构造函数的标记扩展。因此它只能用构造函数语法创建。 另一个 GetValueExtension 标记扩展试图确定所请求值的目标类型,以便它可以进行必要的转换。例如,如果您将第二个扩展的值分配给 Double 类型的属性,GetValueExtension 会理解它并返回 2.0 而不是“2”。虚拟示例:
{MyListX Capacity={GetValue ListCapacityParam}}
如果我将 GetValueExtension 分配给属性,一切都会顺利进行。然后目标类型可以在 MarkupExtension.ProvideValue 中通过
访问((IProvideValueTarget)serviceProvider).TargetProperty.PropertyType
但是当我将 GetValueExtension 用作 MyListYExtension 的构造函数的参数时,TargetProperty 为空:
<!-- no default constructor in MyListY -->
<!-- the first parameter of MyListY is "int capacity" -->
{MyListY {GetValue ListCapacityParam}}
当 XAML 解析器为属性赋值时,它会执行默认转换。 但是当它从标记扩展中获取值时它不会这样做。它会导致无法分配的异常,例如字符串值到 double 属性。 为避免这种情况,我尝试模拟默认转换,但为此需要知道目标类型。
我在 MarkupExtension.ProvideValue 调用中找不到任何解决方法来确定构造函数参数的实际类型。
我可以修改 GetValueExtension 但不能修改 MyListYExtension。
我该怎么做才能解决这个问题?
最佳答案
这看起来像是先有鸡还是先有蛋的问题。问题是构造函数可以重载,为了找到合适的构造函数,框架需要知道您试图传递给它的参数的类型。
换句话说,在调用 ProvideValue
时,不知道将使用什么构造函数,因此无法提供有关目标类型的信息。
关于c# - 访问 MarkupExtension.ProvideValue 中的构造函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11314699/