2016-07-08 29 views
3

在我的一个项目中,我使用了一个抽象UserControl。为了能够在Visual Studio中设计这个控件,我使用了this answer中提出的代码。现在我想用另一个通用的抽象UserControl来使用它。但是,如果我做Visual Studio设计器中的抽象泛型UserControl继承

[TypeDescriptionProvider(typeof(AbstractControlDescriptionProvider<MyBaseControl<T>, UserControl>))] 

我得到的编译器错误

CS0416:属性参数不能使用类型参数

删除类型参数显然没有任何编译。

我不能从一个非一般的基类派生MyBaseControl,因为它已经从一个普通的基类派生,所以我试图用一个接口装饰它,使用它,像这样:

[TypeDescriptionProvider(typeof(AbstractControlDescriptionProvider<IMyBaseControl, UserControl>))] 

编译但是当我打开设计查看我的控制没有得到呈现,而不是我的错误

提供的通用参数的个数不等于泛型类型定义的元数。

有没有办法解决这个问题?

+0

Arributes不与仿制药相同的方式工作,因此为什么'[TypeDescriptionProvider(typeof',因为它不能使用仿制药 –

回答

1

我想你有一个控制AbstractGenericBase<T> : GenericBase<T>其中GenericBase<T>是一个控制有这样的定义:GenericBase<T>: UserControl

所以,如果你想显示在设计师AbstractGenericBase<T>,您可以使用此代码:

using System.ComponentModel; 
using System.Windows.Forms; 

#if DEBUG 
public abstract partial class AbstractGenericBase<T> : NonGenericBase 
#else 
public partial class AbstractGenericBase<T> : GenericBase<T> 
#endif 
{ 
    public AbstractGenericBase() 
    { 
     InitializeComponent(); 
    } 
} 
#if DEBUG 
public class NonGenericBase : GenericBase<object> { } 
#endif 

注意

  • 的目标是展示了这个类设计师:
    public abstract partial class AbstractGenericBase<T> : GenericBase<T>
  • 如果T有一些类型约束,而不是objectGenericBase<object>使用满足一般约束的Dummy
  • 该解决方案基于这样一个事实:当设计者想要在设计界面显示控件时,它会尝试创建一个控件基类的实例。当你的控件的基类是一个泛型类时,设计者不知道如何创建一个基类的实例。
    在上面的解决方案中,对于设计时支持,我们说设计人员对我们的控制基础是NonGenericBase,但是对于运行时,我们保留GenericBase<T>作为我们控制的基类。
+0

的目标是展示了这个类设计师: '公共抽象部分类AbstractGenericBase :GenericBase '。让我知道你的目标是不同的。 –

+0

谢谢,这个作品。我想补充一点,你必须给非泛型类别以外的其他名称,或将其保存在不同的文件中。否则,你会得到错误'类型''由同一个文件中的几个部分类组成' –