【问题标题】:Why System.Windows.Automation.Peers.AutomationPeer.GetPattern() method does not use Generics? [closed]为什么 System.Windows.Automation.Peers.AutomationPeer.GetPattern() 方法不使用泛型? [关闭]
【发布时间】:2012-06-17 16:58:32
【问题描述】:

WPF UI Automation systemGetPattern()方法实现是通过枚举参数PatternInterface来实现的,我们一般是这样使用的:

//Code with original implementation
ButtonAutomationPeer buttonPeer = new ButtonAutomationPeer(button1);
IInvokeProvider provider = (IInvokeProvider)buttonPeer.GetPattern(PatternInterface.Invoke); //Line in Question
//To invoke the click event of button we then use the following code:
provider.Invoke();

从上面的代码看,注释Line in Question的那一行似乎不是强类型,我们需要将GetPattern()方法的返回值强制转换为需要的接口,然后使用调用特定的 UI 自动化。

问题是: 如果WPF 中的GetPattern() 方法的实现是使用.Net Framework 中已经存在的Generics 完成的,会不会更好,如下所示:

public T GetPattern<T>;
  • 在哪里,然后我将传递所需的接口模式名称,而 调用GetPattern&lt;T&gt; 方法并获取该接口实例 强类型,也需要演员表。什么 认为微软在最初的实现中给出了 GetPattern() 方法需要 enum?
  • 在方法参数中使用枚举不会破坏 GetPattern() 原始实现的可维护性。一世 会说当需要一个新的控制接口模式时 支持,模式接口的枚举值需要是 添加到名为PatternInterface 的枚举参数中

我认为使用以下使用调用通用实现的新代码调用方法并获取接口模式更容易更好:

//Code with New Generics based implementation
ButtonAutomationPeer buttonPeer = new ButtonAutomationPeer(button1);
IInvokeProvider provider = buttonPeer.GetPattern<IInvokeProvider>(); //Line in Question
//To invoke the click event of button we then use the following code:
provider.Invoke();

【问题讨论】:

  • 我们无法告诉你微软为何做出特定的设计决定 - 你应该在适当的论坛上询问,看看你是否得到回复
  • @Basic 万一你说不出来,请远离这个问题,不要投票关闭它,因为这个网站上还有很多其他人可能很清楚这个问题的答案并且在实现的利弊方面也有更多的建议,这个问题不是问微软为什么要这样实现;而是询问另一种呈现该方法的方式是否会使编程世界受益,以及如何......
  • @CSharpVJ 如果有人能准确地回答你的问题,那就太好了,但如果你没有得到答案或问题已关闭,那么我建议你在@987654322 上发布这个想法@,这是您唯一可以得到这个问题的好答案的地方。
  • 这是人们过于热衷于结束问题的另一个例子。我认为这是一个非常好的问题。我希望人们不要再比你更圣洁了。

标签: wpf generics c#-4.0 .net-4.0 code-design


【解决方案1】:

这是出于通常的原因:他们没有时间机器。从参考源提供的源代码文件中的“历史”注释中可以看出,UI 自动化类的工作始于 2003 年 6 月左右,有证据表明它源自早期的工作。直到 2005 年,泛型才可用。

来自 dd/wpf/src/UIAutomation/UIAutomationTypes/System/Windows/AutomationPattern.cs:

// History:
//  06/02/2003 : BrendanM Ported to WCP

这很可能是 Brendan McKeon。对“WCP”可能意味着什么没有像样的猜测。

【讨论】:

  • 我想这个 API 的签名现在不能更改,这样做会导致兼容性问题(或者可以更改吗?)..这可能很大程度上是因为这个功能可能没有测试了很多,代码审查了很多..
猜你喜欢
  • 2013-10-14
  • 2020-11-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多