在我的一个项目中,我使用了抽象的UserControl。为了能够在Visual Studio中设计此控件,我使用this answer中提出的代码。现在我想使用另一个抽象的UserControl,它也是通用的。但是如果我做的话
[TypeDescriptionProvider(typeof(AbstractControlDescriptionProvider<MyBaseControl<T>, UserControl>))]
我收到编译错误
CS0416:属性参数不能使用类型参数
删除类型参数显然不会编译。
我无法从非泛型基类派生MyBaseControl,因为它已经从通用基类派生,所以我尝试使用接口进行装饰并使用它如下:
[TypeDescriptionProvider(typeof(AbstractControlDescriptionProvider<IMyBaseControl, UserControl>))]
这个 编译但是当我打开设计视图时我的控件没有被渲染,而是我得到了错误
提供的通用参数的数量不等于泛型类型定义的arity。
有没有办法解决这个问题?
答案 0 :(得分: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
有一些类型限制,而不是object
中的GenericBase<object>
,请使用符合通用约束条件的Dummy
。NonGenericBase
,但是对于运行时,我们将GenericBase<T>
作为控件的基类。