【问题标题】:Change "ToString" for a sealed class为密封类更改“ToString”
【发布时间】:2010-01-22 22:27:49
【问题描述】:

我正在学习一个班级:

public sealed class WorkItemType

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

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

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

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

【问题讨论】:

    标签: c# tostring sealed


    【解决方案1】:

    一个相当巧妙的方法可能是向WorkItemType 对象添加一个扩展方法。像这样的:

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

    然后你可以调用类似的东西

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 创建转换器非常适合转至字符串,但对于设置值则更难(获取字符串并转至 WorkItemType)。 ToString 允许您仍然显示实际项目而不是转换后的项目。不过,我认为这是我最好的选择。
      • 是的,如果您还需要能够 from 获取对象,无论您使用的是什么控件,在我看来,您基本上有两个之一选择。您可以将FormatWorkItemParseWorkItem(或TryParseWorkItem)方法配对,或者您可以编写自己的用户控件,在内部维护一个集合并提供一个接口来提供自定义格式化程序。第一个选项是最快的,但可能是一个不完美的解决方案,特别是如果您的每个对象都不能保证具有唯一的字符串表示。
      【解决方案3】:

      WPF 提供了几种不同的内置方法来在 UI 中正确执行此操作。我推荐两个:

      • 您可以使用 ComboBox 的 DisplayMemberPath 显示单个 属性值,但仍然选择 WorkItemType 对象。
      • 如果要显示 您可以更改的一些属性 ComboBox 的 ItemTemplate 来制作它 看起来几乎随心所欲- 格式化文本,添加边框, 颜色等。您甚至可以设置 DataTemplate 自动成为 应用于任何 WorkItemType 对象 绑定在您的 UI 中的任何位置 (与 UI 相同的基本效果 改变 ToString) 的观点 将其放入资源并给予 它只是一个没有 x:Key 的 DataType。

      【讨论】:

      • 甜蜜的答案!我赞成您的其他一些答案为“付款”。谢谢!
      【解决方案4】:

      你不走运:-(

      您可以编写自己的类来包装 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"
        }
      }
      

      【讨论】:

        【解决方案5】:

        我没有任何 C# 知识,但你不能将你的扩展类包装在另一个类中吗?代理所有方法调用到扩展类,除了toString(),也很hackish,但我想我还是会提出来。

        【讨论】:

        • 我不会认为这是一个“黑客”,至多是一个简单的解决方法:)。
        【解决方案6】:

        用反射做一些魔法可能是你唯一的希望。我知道你可以用它实例化私有构造函数,所以也许你可以覆盖一个密封的类......注意,如果没有其他办法,这应该是你最后的手段。使用反射是一种非常老套/不恰当的做法。

        【讨论】:

        • 不幸的是,您不能使用反射更改现有类型的结构(即更改其访问修饰符或添加/删除成员)。 Reflection.Emit 将允许您创建新类型,但仍然无法替换给定类型,因为这涉及更改签名程序集。
        【解决方案7】:

        除了the other WPF-specific answer,您还可以在绑定中使用IValueConverter 来格式化/显示您想要的WorkItemType。这具有可重复使用的优点(例如,如果您想在其他控件中显示对象。)

        这里有many examples 使用转换器。这个other question 应该与这里提到的 ComboBox 用法非常相似。答案指出,您可以使转换器在整个对象集合上工作,也可以一次在一个项目上工作。后者可能是更可重用的方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多