C#面试题更新 2026-08-03

请说明在 WPF 中实现自定义 MarkupExtension 的步骤与要点,包括类层次结构、必须重写的成员及用法示例。

考察说明

考查对 WPF 标记扩展机制的理解及自定义实现能力。

回答思路

  1. 【回答框架 1】自定义 MarkupExtension 需要继承 MarkupExtension 抽象类,并重写 ProvideValue(IServiceProvider serviceProvider) 方法,该方法返回实际用于 XAML 的值。
  2. 【回答框架 2】实现类通常包含公共属性或构造函数参数,用于接收 XAML 中的参数,例如新建类 MyExtension : MarkupExtension,声明属性 Value,在 ProvideValue 中返回该属性。
  3. 【回答框架 3】在 XAML 中使用时,通过花括号语法引用,如 {local:MyExtension Value=...},并可指定转换器或服务上下文。
  4. 【回答框架 4】ProvideValue 可通过 serviceProvider 获取 IProvideValueTarget 等接口,进而访问目标对象、属性或类型,实现动态绑定。
  5. 【回答框架 5】注意返回值类型需与目标属性兼容,可返回延迟值或表达式,但需避免污染共享资源。
  6. 【关键点 1】继承 MarkupExtension 并重写 ProvideValue 是核心。
  7. 【关键点 2】使用构造函数或属性传递参数。
  8. 【关键点 3】利用 serviceProvider 获取目标上下文。
  9. 【关键点 4】返回值类型必须匹配目标属性。
  10. 【关键点 5】XAML 语法使用花括号扩展。
  11. 【易错点 1】不能将 ProvideValue 返回值视为共享实例,除非明确单例。
  12. 【易错点 2】对同一实例多次使用时需注意状态冲突。
  13. 【易错点 3】未处理服务为 null 的情况可能导致空引用异常。