1

我有从通用基本表单继承并按预期执行的表单,但它们不会显示在设计器中。

我在网上四处搜寻,发现一些关于 SO 的问题和一些说使用自定义 TypeDescriptionProvider 的博客文章。我发现的文章大约是 2008-2010 年。

使用 Visual Studio Whidbey 设计抽象表单

通用表单和 VS 设计器

这仍然是 2013 年 9 月使用 VS2012、.NET 4.0 的方法吗?

4

2 回答 2

0

许多人声称使用适用于抽象基类的 TypeDescriptionProvider 的相同机制应该适用于泛型基类,但是我还没有遇到任何真正让它工作的人。

我花了几个小时试图让基于 TypeDescriptionProvider 的解决方案适用于通用基类,但与抽象基类不同,设计者似乎没有尝试使用指定的类型描述符提供程序(通过使用一个 VS 实例进行调试来验证另一个 VS 实例的设计器)。

有可能让它工作,但属性解决方案在一般情况下不能开箱即用。甚至 OP 参考文章的作者(似乎已从此处逐字复制)在评论中承认他尚未对其进行泛型测试。

有人有运气吗?

于 2014-04-30T10:59:15.227 回答
0

不是一个一直有效的解决方案,但这在大多数情况下都可以:

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,都需要构建一次,仅此而已。

于 2020-01-07T13:26:25.503 回答