[英]Is using a custom TypeDescriptionProvider still the only way around using generic forms in the designer for VS2012?
我有从通用基本表单继承并按预期执行的表单,但是它们没有显示在设计器中。
我在网上搜索并在 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,都需要构建一次,仅此而已。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.