Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.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#中使用一般形式吗?_C#_.net_Winforms - Fatal编程技术网

你能在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);