Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用自定义TypeDescriptionProvider仍然是在VS2012设计器中使用通用表单的唯一方法吗?_C#_Generics_Visual Studio 2012_.net 4.0_Visualdesigner - Fatal编程技术网

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

C# 使用自定义TypeDescriptionProvider仍然是在VS2012设计器中使用通用表单的唯一方法吗?,c#,generics,visual-studio-2012,.net-4.0,visualdesigner,C#,Generics,Visual Studio 2012,.net 4.0,Visualdesigner,我有一些表单继承自通用基表单并按预期执行,但它们不会显示在设计器中 我在网上搜索了一下,发现了一些关于SO的问题,还有一些博客文章说使用自定义TypeDescriptionProvider。我找到的文章大约是2008-2010年 2013年9月,使用VS2012、.NET 4.0,这仍然是一条路吗?许多人声称,使用TypeDescriptionProvider的用于抽象基类的相同机制也适用于泛型基类,但我还没有遇到任何人真正让它工作 我花了几个小时试图使基于TypeDescriptionProv

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

我在网上搜索了一下,发现了一些关于SO的问题,还有一些博客文章说使用自定义TypeDescriptionProvider。我找到的文章大约是2008-2010年


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

弗雷德说,这些问题仍然存在,因为设计师已经有一段时间没有爱了。这提醒了我,我需要更新那篇博客文章,因为当我第一次看到它时,TypeDescriptionProvider解决方案并不存在。我确定的解决方案涉及到一个代理类型,它解决了设计器中的泛型参数。谢谢,我知道这是一个很糟糕的问题,很难用5个字符或更多字符来回答,但我想检查一下。你能在你的问题中添加一些与此相关的链接吗?我对TypeDescriptionProvider解决方案很好奇。哈哈,我只是想问你关于你的解决方案的链接。我还没有决定。将放置链接。这是我过去使用过的解决方案。另一个解决方案似乎是针对抽象基表单,而不是泛型表单。我放弃了,我不再相信它:为泛型工作的TypeDescriptionProvider只是一个城市传奇,徘徊在旧的404论坛帖子或附件中。