更改密封类的“ToString”

我有一个我正在上课的课程:

public sealed class WorkItemType 

它的ToString很弱(只显示Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemType )。

有没有办法覆盖它来显示WorkItemType的名称?

通常我只会在新类中聚合该值,但我在WPF中使用它来进行绑定(我希望在combobox中有一个WorkItemTypes列表,并将所选值分配给绑定的WorkItemType变量。)

我想我在这里运气不好,但我想我会问。

需要覆盖ToString吗? 如果您控制显示对象的代码,则始终可以提供FormatWorkItemType方法或类似的效果。

一种相当简洁的方法可能是向WorkItemType对象添加一个extenesion方法。 像这样的东西:

 public static class ToStringExtension { public static string MyToString(this WorkItemType w) { return "Some Stuff" } } 

然后你可以打电话

 WorkItemType w = new WorkItemType; Debug.WriteLine(w.MyToString();) 

你运气不好:-(

您可以编写自己的类来包装WorkItemType并将其委托给它(代理)期望ToString:

 class MyWorkItemType { private WorItemType _outer; public MyWorkItemType(WorkItemType outer) { _outer=outer; } public void DoAction() { _outer.DoAction(); } // etc public override string ToString() { return "my value" } } 

我没有任何C#知识,但是你不能将扩展类包装在另一个类中吗? 代理所有方法调用扩展类,除了toString() ,也非常hackish,但我认为无论如何我都会提起它。

WPF提供了一些不同的内置方法来在UI中执行此操作。 两个我建议:

  • 您可以使用ComboBox的DisplayMemberPath显示单个属性值,但仍然可以从WorkItemType对象中进行选择。
  • 如果你想显示一些属性的复合,你可以改变ComboBox的ItemTemplate,使它看起来很像你想要的 – 格式化文本,添加边框,颜色等。你甚至可以设置DataTemplate自动应用于任何WorkItemType对象,它被绑定到UI中的任何位置(从UI角度来看与改变ToString相同的基本效果),方法是将它放入Resources并仅为其提供不带x:Key的DataType。

用reflection做一些魔术可能是你唯一的希望。 我知道你可以用它来实例化私有构造函数,所以也许你可以覆盖一个密封的类…注意,如果没有别的办法,这应该是你最后的选择。 使用reflection是一种非常hackish /不正确的方式。