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

问题描述 投票:1回答:2

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

我四处搜寻,在SO上找到了一些问题,并在博客文章中发现使用自定义TypeDescriptionProvider。我发现的文章大约在2008-2010年。

Using Visual Studio Whidbey to Design Abstract Forms

Generic forms and VS designer

还是2013年9月使用VS2012,.NET 4.0的方法吗?

c# generics visual-studio-2012 .net-4.0 visualdesigner
2个回答
0
投票

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

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

可能有可能使它起作用,但是在一般情况下,属性解决方案无法即用。即使是OP所引用文章的作者(似乎已经从here逐字复制)在评论中也承认他没有对泛型进行过测试。

有人有运气吗?


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

© www.soinside.com 2019 - 2024. All rights reserved.