繁体   English   中英

使用自定义 TypeDescriptionProvider 仍然是在 VS2012 设计器中使用通用表单的唯一方法吗?

[英]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 设计抽象表单

通用表单和 VS 设计器

这仍然是 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM