通常在列表窗体a中单击“添加”按钮打开一个对话框b做新增或修改操作,这时需要从a中传一些参数给b,于是我们使用以下方法:
在b.cs中写一个Hashtable的属性args,然后定义一个全局的枚举argName。然后在a中这样传参:
Form b = new Form();
b.args[argName.单位名] = "单位1";
然后在b.cs中这样取值:string unitname = args[argName.单位名] as string。
现在的问题是这个args[argName.单位名]是object类型的,每次取值还得类型转换,如果为null,转换时还得判断是否异常,挺麻烦的,而且我也不喜欢多一个全局的枚举项作键名,有没有更好的办法可以实现类似的万能传参,就像js对象一样最好,只要有一个宿主,可以随时随地往宿主里面添加对象,然后直接给该对象赋值。
另外,我也试过Directonary<K,V>,问题是这玩意实例化时必须指明V的类型,所以不能用它,用Struct吧它的权限问题又太麻烦,总之就是想不到一个更好的招,特此求教高人指点
很遗憾地告诉你,作为一门强类型的语言,C#中没有你想象中那么"美好"的东西
Form b = new Form();
b.Controls.add(***)
你直接在B类中声明属性就行啦,比如你要编辑用户信息,那么就直接在B里声明一个用户属性:
public User 用户{get;set;}
然后把什么文本框之类的控件属性绑定到这个属性对象的属性上就可以了。
或者如果你没有定义类型,那就分别声明有意义的属性就可以:
public string 名称{get;set;}
public bool 性别{get;set;}
在A窗体调用的时候就可以直接赋一个初始值:
var b=new B();
b.性别=true;
b.Show();
这样强类型的参数传递是最佳的方案。
还有什么疑问可以补充,或发短消息给我。
用Object好了,要不用泛型也不错