更改密封类的“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 /不正确的方式。