Измените «ToString» для закрытого класса - PullRequest
4 голосов
/ 23 января 2010

У меня есть класс, с которым я работаю:

public sealed class WorkItemType

Это ToString слабое (просто показывает Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemType).

Есть ли способ переопределить это, чтобы показать имя WorkItemType?

Обычно я просто собираю значение в новом классе, но я использую это для привязок в WPF (я хочу иметь список WorkItemTypes в поле со списком и назначить выбранное значение связанной переменной WorkItemType. )

Я думаю, что мне здесь не повезло, но я подумал, что спрошу.

Ответы [ 6 ]

5 голосов
/ 23 января 2010

Довольно удобный способ сделать это - добавить метод расширения к объекту WorkItemType. Как то так:

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

Тогда вы могли бы назвать что-то вроде

WorkItemType w = new WorkItemType;
Debug.WriteLine(w.MyToString();)
4 голосов
/ 23 января 2010

Вам нужно для переопределения ToString? Если вы управляете кодом, в котором отображается объект, вы всегда можете предоставить метод FormatWorkItemType или что-то на этот счет.

2 голосов
/ 23 января 2010

Тебе не повезло: - (

Вы можете написать свой собственный класс, который обёртывает 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"
  }
}
1 голос
/ 23 января 2010

WPF предоставляет несколько различных встроенных способов сделать это прямо в пользовательском интерфейсе. Два я бы порекомендовал:

  • Вы можете использовать ComboBox DisplayMemberPath для отображения одного значение свойства, но все равно выберите из объекты WorkItemType.
  • Если вы хотите отобразить композит из несколько свойств, которые вы можете изменить ItemTemplate ComboBox, чтобы сделать его выглядите так, как хотите - форматирование текста, добавление границ, цвета и т. д. Вы даже можете настроить DataTemplate для автоматического применяется к любому объекту WorkItemType который привязан где-нибудь в вашем интерфейсе (тот же базовый эффект от пользовательского интерфейса перспектива как изменение ToString) положить его в ресурсы и давая это только DataType без x: Key.
1 голос
/ 23 января 2010

У меня нет знаний по C #, но разве вы не можете поместить свой расширенный класс в другой класс? Прокси все вызовы методов для расширенного класса, кроме toString(), тоже очень хакерские, но я все равно подумал.

0 голосов
/ 23 января 2010

Возможно, твоя магия Сорта с отражением - твоя единственная надежда. Я знаю, что вы можете создавать с его помощью частные конструкторы, так что, возможно, вы можете переопределить закрытый класс ... Обратите внимание, это должно быть вашим последним средством, если серьезно нет другого пути. Использование отражения - очень хакерский / неправильный способ сделать это.

...