Существует две службы, которые могут помочь вам во время разработки обнаружить и разрешить все типы решений:
С другой стороны, чтобы показать стандартные значения в раскрывающемся списке в редакторе свойств, вы можете создать TypeConverter
:
TypeConverter
: Предоставляет унифицированный способ преобразования типов значений в другие типы, а также для доступа к стандартным значениям и подвойствам.
Зная о вышеописанных параметрах, вы можетесоздайте пользовательский конвертер типов, чтобы обнаружить все типы форм в проекте и список в раскрывающемся списке.
Пример
В следующем примере я создал пользовательский класс кнопок, который позволяет вам выбирать тип формы в типе дизайна, а затем во время выполнения,если вы нажмете на кнопку, в диалоговом окне отобразится выбранная форма:
Чтобы увидеть версию VB.NET для этого ответа, см. этот пост .
MyButton
using System;
using System.ComponentModel;
using System.Windows.Forms;
public class MyButton : Button
{
[TypeConverter(typeof(FormTypeConverter))]
public Type Form { get; set; }
protected override void OnClick(EventArgs e)
{
base.OnClick(e);
if (Form != null && typeof(Form).IsAssignableFrom(Form))
{
using (var f = (Form)Activator.CreateInstance(Form))
f.ShowDialog();
}
}
}
FormTypeConverter
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Globalization;
using System.Linq;
using System.Windows.Forms;
public class FormTypeConverter : TypeConverter
{
public override bool GetStandardValuesExclusive
(ITypeDescriptorContext context)
{
return true;
}
public override bool CanConvertTo
(ITypeDescriptorContext pContext, Type pDestinationType)
{
return base.CanConvertTo(pContext, pDestinationType);
}
public override object ConvertTo
(ITypeDescriptorContext pContext, CultureInfo pCulture,
object pValue, Type pDestinationType)
{
return base.ConvertTo(pContext, pCulture, pValue, pDestinationType);
}
public override bool CanConvertFrom(ITypeDescriptorContext pContext,
Type pSourceType)
{
if (pSourceType == typeof(string))
return true;
return base.CanConvertFrom(pContext, pSourceType);
}
public override object ConvertFrom
(ITypeDescriptorContext pContext, CultureInfo pCulture, object pValue)
{
if (pValue is string)
return GetTypeFromName(pContext, (string)pValue);
return base.ConvertFrom(pContext, pCulture, pValue);
}
public override bool GetStandardValuesSupported
(ITypeDescriptorContext pContext)
{
return true;
}
public override StandardValuesCollection GetStandardValues
(ITypeDescriptorContext pContext)
{
List<Type> types = GetProjectTypes(pContext);
List<string> values = new List<string>();
foreach (Type type in types)
values.Add(type.FullName);
values.Sort();
return new StandardValuesCollection(values);
}
private List<Type> GetProjectTypes(IServiceProvider serviceProvider)
{
var typeDiscoverySvc = (ITypeDiscoveryService)serviceProvider
.GetService(typeof(ITypeDiscoveryService));
var types = typeDiscoverySvc.GetTypes(typeof(object), true)
.Cast<Type>()
.Where(item =>
item.IsPublic &&
typeof(Form).IsAssignableFrom(item) &&
!item.FullName.StartsWith("System")
).ToList();
return types;
}
private Type GetTypeFromName(IServiceProvider serviceProvider, string typeName)
{
ITypeResolutionService typeResolutionSvc = (ITypeResolutionService)serviceProvider
.GetService(typeof(ITypeResolutionService));
return typeResolutionSvc.GetType(typeName);
}
}