我正在尝试创建从“泛型”基类继承的表单,其中该基类的泛型参数具有必须实现其中一个接口的约束。
它编译并运行得很好。我的问题在于Visual Studio设计器。它将打开表单,直到我重建项目,然后在尝试查看表单设计器时报告下面的错误,直到我重新启动Visual Studio,或删除基类中的自定义接口约束。
GenericArguments[0], 'InterfaceInBaseClassProblem.TestEntity', on 'InterfaceInBaseClassProblem.BaseWindowClass`1[EntityType]' violates the constraint of type 'EntityType'.
第1步:创建界面
namespace InterfaceInBaseClassProblem
{
public interface ITestInterface
{
void Func1();
}
}
步骤2:创建一个实现接口的类
namespace InterfaceInBaseClassProblem
{
public class TestEntity : ITestInterface
{
public void Func1()
{
}
}
}
步骤3:创建一个通用基类Form,需要一个通用参数约束,要求实现我们创建的接口
using System.Windows.Forms;
namespace InterfaceInBaseClassProblem
{
public class BaseWindowClass<EntityType> : Form where EntityType : ITestInterface
{
}
}
步骤4:现在创建一个继承自Generic Base Form的新表单,并使用TestEntity类作为参数
namespace InterfaceInBaseClassProblem
{
public partial class Form1 : BaseWindowClass<TestEntity>
{
public Form1()
{
InitializeComponent();
}
}
}
步骤5:保存项目并测试我正在尝试解决的以下行为:
a) Close Visual Studio
b) Open Visual Studio
c) Open the Form1 class to view its designer and confirm its working
d) Close the Form1 designer you just opened
e) Rebuild the project
f) Open the Form1 class to view the error I have reported.
g) Either restart Visual Studio, or comment out the "where EntityType : ITestInterface" constraint we included with step 3 and rebuild to see it start working again
附加说明:
答案 0 :(得分:2)
如果微软看到这一点,我会遇到类似的问题。在VS2015中确认。我有4种形式:
public class BaseForm : Form
{
public BaseForm() {...}
}
public class BaseSubForm<T> : Form where T : BaseForm
{
public SubForm(T f) {...}
public InitForm(T f) {...}
}
public partial class TestForm : BaseForm
{
TestSubForm sf;
public TestForm()
{
...
sf = new TestSubForm(this);
}
}
public partial class TestSubForm : BaseSubForm<TestForm>
{
public TestSubForm(TestForm f) : base(f)
{
InitializeComponent();
}
}
如果我构建它,它会运行,但TestSubForm
不会在设计器中显示。但是,如果我从BaseSubForm的构造函数中删除参数......
...
public SubForm() {...}
...
sf = new TestSubForm();
...
public TestSubForm(TestForm f)
...
我可以重新启动Visual Studio,构建它,它会显示得很好。我可以在InitForm
,我的第二阶段构造函数中传递该参数,但是它很烦人,我需要2个构造函数。
Designer似乎讨厌类型Subclass : BaseClass<Generic>