Данная статья является переводом статьи 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.