TFS2010 - Использование TypeConverter для отображения пользовательского списка типов параметров.

Данная статья является переводом статьи Jason Prickett “TFS 2010 - Using a TypeConverter to display your custom Process Parameter list type

«Как я могу получить мой пользовательский список параметров для отображения чего-либо, вместо слова ‘(Collection)’ в таблице свойств Process Parameters?»

Ответ на этот вопрос очень прост, если вы знакомы с таблицей свойств (property grid) в WindowsForms. Класс PropertyGrid ищет атрибуты конвертера типа в классах, чтобы определить, как их отображать. Для простого класса (не конвертируемого в строку), если вы ничего не предпримите, этот процесс просто вызовет ToString() для отображения текста, и текст будет доступен только для чтения. Для списка или коллекции, процесс не будет вызывать ToString. Вместо этого он отобразит ‘(Collection)’. И это значение также будет доступно только для чтения.

Однако, если добавить TypeConverter в ваш класс или список, вы можете сообщить PropertyGrid как отобразить ваш класс, или, даже как производить редактирование в таблице свойств. Ниже – приведен пример списка строк. Он содержит конвертер типов, который позволяет пользователю добавлять информацию к списку и просматривать его без необходимости использования специализированного редактора.

Замечание: данный класс является лишь простой демонстрацией. Например, он не поддерживает работу со строками, содержащими запятые.

  using System;
  using System.Collections.Generic;
  using System.ComponentModel;
  using System.Globalization;
  
  namespace MyCustomProcessParameters
  {
      [Serializable]
      [TypeConverter(typeof(ListOfStringsTypeConverter))]
      public class ListOfStrings : List<String>
      {
          public ListOfStrings()
              : base()
          {
          }
  
          public ListOfStrings(String list)
              : base()
          {
              AddRange(list.Split(new char[] {  }, StringSplitOptions.RemoveEmptyEntries));</span'
          }
  
          public override string ToString()
          {
              return String.Join(",", this);
          }
      }
  
      internal class ListOfStringsTypeConverter : TypeConverter
      {
          public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
          {
              return ((sourceType == typeof(String)) || base.CanConvertFrom(context, sourceType));
          }
  
          public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
          {
              return ((destinationType == typeof(String)) || base.CanConvertTo(context, destinationType));
          }
  
          public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
          {
              if (!(value is String))
              {
                  return base.ConvertFrom(context, culture, value);
              }
  
              return new ListOfStrings((String)value);
          }
  
          public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
          {
              if (destinationType != typeof(String) || !(value is ListOfStrings))
              {
                  return base.ConvertTo(context, culture, value, destinationType);
              }
  
              return value.ToString();
          }
      }
  
  }
  
  

Вот, как это выглядит в тестовом приложении, содержащем PropertyGrid:

На картинке выше вы можете видеть, что я добавил три свойства «только для чтения» к своему объекту, который позволяет мне отобразить каждый из элементов в списке.

Заметьте, что TypeConverter работает с типами параметров вашего процесса, возможно вам понадобится развернуть SP1 на TFS2010, и нужно убедиться, что ваши сборки находятся в нужной директории Visual Studio.