我有从通用基本表单继承并按预期执行的表单,但它们不会显示在设计器中。
我在网上四处搜寻,发现一些关于 SO 的问题和一些说使用自定义 TypeDescriptionProvider 的博客文章。我发现的文章大约是 2008-2010 年。
使用 Visual Studio Whidbey 设计抽象表单
这仍然是 2013 年 9 月使用 VS2012、.NET 4.0 的方法吗?
我有从通用基本表单继承并按预期执行的表单,但它们不会显示在设计器中。
我在网上四处搜寻,发现一些关于 SO 的问题和一些说使用自定义 TypeDescriptionProvider 的博客文章。我发现的文章大约是 2008-2010 年。
使用 Visual Studio Whidbey 设计抽象表单
这仍然是 2013 年 9 月使用 VS2012、.NET 4.0 的方法吗?
许多人声称使用适用于抽象基类的 TypeDescriptionProvider 的相同机制应该适用于泛型基类,但是我还没有遇到任何真正让它工作的人。
我花了几个小时试图让基于 TypeDescriptionProvider 的解决方案适用于通用基类,但与抽象基类不同,设计者似乎没有尝试使用指定的类型描述符提供程序(通过使用一个 VS 实例进行调试来验证另一个 VS 实例的设计器)。
有可能让它工作,但属性解决方案在一般情况下不能开箱即用。甚至 OP 参考文章的作者(似乎已从此处逐字复制)在评论中承认他尚未对其进行泛型测试。
有人有运气吗?
不是一个一直有效的解决方案,但这在大多数情况下都可以:
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,都需要构建一次,仅此而已。