你能在C#中使用一般形式吗?
您应该能够创建一个通用表单:你能在C#中使用一般形式吗?,c#,.net,winforms,C#,.net,Winforms,您应该能够创建一个通用表单: public partial class MyGenericForm<T> : Form where T : class { /* form code */ public List<T> TypedList { get; set; } } 公共部分类MyGenericForm: 表格T:类 { /*表格代码*/ 公共列表类型列表{get;set;} } 是有效的C#,并编译。但是,如果有任何图像表明设计器找不到资源
public partial class MyGenericForm<T> :
Form where T : class
{
/* form code */
public List<T> TypedList { get; set; }
}
公共部分类MyGenericForm:
表格T:类
{
/*表格代码*/
公共列表类型列表{get;set;}
}
是有效的C#,并编译。但是,如果有任何图像表明设计器找不到资源,则设计器将无法工作,窗体将引发运行时异常
我认为这是因为windows窗体设计器假定资源将以简单类型的名称存储。我有一个解决方法,它可以工作,但并不理想: 向项目中添加一个新类,该类用其简单名称继承表单
internal class MyGenericForm:
MyGenericForm<object> { }
内部类MyGenericForm:
MyGenericForm{}
这意味着,尽管设计器仍然错误,但仍然可以找到预期的简单类型(即没有
)。是的,您可以!这是我不久前用这个技巧写的一篇博文:
编辑:看起来你已经这样做了。这个方法很好,所以我不认为它太笨拙。 < P>你可以在三个步骤中完成。 1) 在Form1.cs文件中替换
public partial class Form1<TEntity, TContext> : Formbase // where....
如果旧石器时代的密码没有吓到你
public static MyForm GetInstance<T>(T arg) where T : MyType
{
MyForm myForm = new MyForm();
myForm.InitializeStuffs<T>(arg);
myForm.StartPosition = myForm.CenterParent;
return myForm;
}
公共静态MyForm GetInstance(T arg),其中T:MyType
{
MyForm MyForm=新的MyForm();
myForm.InitializeStuffs(arg);
myForm.StartPosition=myForm.CenterParent;
返回我的表格;
}
使用它
var myFormInstance = MyForm.GetInstance<T>(arg); myFormInstance.ShowDialog(this);
var myFormInstance=MyForm.GetInstance(arg);myFormInstance.ShowDialog(此);
如果您有3张表格怎么办?我要表格三:表格二。这包括Form2中的泛型类型参数+控件。有什么想法吗?1)这只是两个步骤,b)Designer.cs中的任何内容都是由VS自动生成的,在运行时可以随时被覆盖,这不会导致任何问题,但表单在设计阶段有问题。对于此System.ComponentModel.ComponentResourceManager资源=新的System.ComponentModel.ComponentResourceManager(typeof(Form1));编辑行后,必须再次添加它。是的,这是我的观点-VS可能会随时撤消您的工作,而依靠手动过程每次都会修复它,这只是在寻找bug。在某个时刻,您(或使用您的代码的人)可能会忘记,您将得到一个运行时错误,因为它找不到资源。
public static MyForm GetInstance<T>(T arg) where T : MyType
{
MyForm myForm = new MyForm();
myForm.InitializeStuffs<T>(arg);
myForm.StartPosition = myForm.CenterParent;
return myForm;
}
var myFormInstance = MyForm.GetInstance<T>(arg); myFormInstance.ShowDialog(this);