我有从通用基本表单继承并按预期执行的表单,但是它们没有显示在设计器中。
我四处搜寻,在SO上找到了一些问题,并在博客文章中发现使用自定义TypeDescriptionProvider。我发现的文章大约在2008-2010年。
Using Visual Studio Whidbey to Design Abstract Forms
还是2013年9月使用VS2012,.NET 4.0的方法吗?
[许多人声称使用TypeDescriptionProvider的机制适用于抽象基类应该适用于泛型基类,但是我还没有遇到任何真正使它起作用的人。
我花了一个小时的时间来尝试使基于TypeDescriptionProvider的解决方案适用于通用基类,但是与抽象基例不同,设计人员似乎没有尝试使用指定的类型描述符提供程序(通过使用一个VS实例进行验证调试另一个VS实例的设计器)。
可能有可能使它起作用,但是在一般情况下,属性解决方案无法即用。即使是OP所引用文章的作者(似乎已经从here逐字复制)在评论中也承认他没有对泛型进行过测试。
有人有运气吗?
不是始终有效的解决方案,但这在大多数情况下都会起作用:
class GenericControlDescriptionProvider : TypeDescriptionProvider
{
public GenericControlDescriptionProvider()
: base(TypeDescriptor.GetProvider(typeof(ContainerControl)))
{
}
public override Type GetReflectionType(Type objectType, object instance)
{
if (objectType.IsGenericType)
{
return objectType.BaseType;
}
return base.GetReflectionType(objectType, instance);
}
public override object CreateInstance(IServiceProvider provider, Type objectType, Type[] argTypes, object[] args)
{
if (objectType.IsGenericType)
{
objectType = objectType.BaseType;
}
return base.CreateInstance(provider, objectType, argTypes, args);
}
}
我要检查的是目标类型是否为通用类型,如果是,则使用其基类。这里的假设是,基类对于设计人员而言是适当的可实例化类。一个例子:
[TypeDescriptionProvider(typeof(GenericControlDescriptionProvider))]
public abstract class FormBase<TViewModel> : Form
[已针对VS 2017,.NET 4.5.2测试。在VS流程的整个生命周期中,必须解决一次问题(阅读演示项目)。每次启动VS时,都需要构建一次,仅此而已。