为了账号安全,请及时绑定邮箱和手机立即绑定

该如何使用C#中对不同类的实例对象进行批量操作?

该如何使用C#中对不同类的实例对象进行批量操作?

C# C
PIPIONE 2021-11-19 11:11:02
已知:public Hashtable ht=new Hashtable();public class class1{public string name="c1";}public class class2{public string name="c2";}public class class3{public string name="c3";}// .// .// .//class1,class2,class3……classN 这些类可以看成是一些写好forms窗体类public class classN{public string name="cN";}public class change{public change(){}public void rename(类型? ci,string stri) //???这个地方怎么定义参数ci???{ci.name=stri;}}想要的操作://对N个类进行判断操作。如果类被实例化一次,直接修改name;如果没有,则实例化,然后修改nameif (ht中是否记录了对象c1的ID) { c1.name="c11";}else { c1=new class1(); c1.name="c11";添加c1的ID到ht中 }if (ht中是否记录了对象c2的ID) { c2.name="c22";}else { c2=new class2(); c1.name="c22"; 添加c2的ID到ht中 }if (ht中是否记录了对象c3的ID) { c3.name="c33";}else { c3=new class3(); c1.name="c33"; 添加c3的ID到ht中 }// .// .// .if (ht中是否记录了对象cN的ID) { cN.name="cNN";}else { cN=new classN(); c1.name="cNN"; 添加cN的ID到ht中 }最终需要的类:(转化为批量操作:)public void main(){change change1=new change();change1.rename(c2,c2.name+"2")change1.rename(c5,c5.name+"5")change1.rename(c99,c99.name+"99")}说明上面那些代码可能语法不对,请高手自己改成C#下的。只希望能看懂我的问题所在。假设有100个窗体类class1,class2,class3 ... class100,不需要实例化所有的窗体,而是需要对某个窗体操作时,再判断窗体是否被实例化启动了,然后再修改 所实例化的窗体的内容。而且修改时,必须把窗体类当作一个变量方便批量操作。因此1 需要定义一个 change类,控制所有的窗体情况。怎么写好这个change类???2 或者怎么可以把窗体类class1,class2,class....N这些当作一个变量?直接拿原例来说吧:frm1 f1= new frm1();f1.Load += new EventHandler(form_Load);f1.Closed += new EventHandler(form_Closed);f1.Show();frm2 f2= new frm2();f2.Load += new EventHandler(form_Load);f2.Closed += new EventHandler(form_Closed);f2.Show();frmN fN= new frmN();fN.Load += new EventHandler(form_Load);fN.Closed += new EventHandler(form_Closed);fN.Show();能不能编写个函数供调用:如下public void bindForm(System.Windows.Forms fi){frmi fi= new frmi();fi.Load += new EventHandler(form_Load);fi.Closed += new EventHandler(form_Closed);fi.Show();}反正就是不知道如何写参数fi的类型,因为frm1,frm2,frm3等等这些类同属于一个命名空间,但父类forms也不对!怎么可以把frmi这个类,转化为一个可调用的参数刚查了下,貌似用反射机制来实现。但还是不太会:public void bindForm(string formclassName){创建formclassName对应的窗体类实例,调用里面的方法设置某些成员的属性。}
查看完整描述

2 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

用反射:

主调类:
private void button3_Click(object sender, EventArgs e)
{
bindForm("WindowsApplication1.UserControl1");
}

private void bindForm(string f)
{
System.Type t = System.Type.GetType(f);
object ff = Activator.CreateInstance(t,null);
System.Reflection.MethodInfo method = t.GetMethod("setText");
System.Reflection. BindingFlags flag = System.Reflection. BindingFlags.Public |System.Reflection. BindingFlags.Instance;
object returnValue = method.Invoke(ff, null);
}
各窗体:
public partial class UserControl1 : Form
{
public UserControl1()
{
InitializeComponent();
}
public void setText()
{
Text = "kkk";
Show();
}
}



查看完整回答
反对 回复 2021-11-23
?
智慧大石

TA贡献1946条经验 获得超3个赞

public void rename(类型? ci,string stri) //???这个地方怎么定义参数ci???

用object ci
对象.万类之根~~
剩下的不说啦哈哈~

最好你用
public void rename(ref string name,string stri)用引用参数
{
name = stri;
}

rename(class1.name,"123");
//然后这里class1.name 就被设成"123"了

反射机制-----本人以前也只稍微研究过一会,也不太熟悉,以下提供为参考

System.Reflection.Assembly

Assembly assembly = Assembly.LoadFile("dll绝对路径");
Module[] modules = assembly.GetModules();
//得到方法
---------------------------------------------

//获取类型信息
Type t = Type.GetType("TestSpace.TestClass");
//构造器的参数
object[] constuctParms = new object[]{"timmy"};
//根据类型创建对象
object dObj = Activator.CreateInstance(t,constuctParms);
//获取方法的信息
MethodInfo method = t.GetMethod("GetValue");
//调用方法的一些标志位,这里的含义是Public并且是实例方法,这也是默认的值
BindingFlags flag = BindingFlags.Public | BindingFlags.Instance;
//GetValue方法的参数
object[] parameters = new object[]{"Hello"};
//调用方法,用一个object接收返回值
object returnValue = method.Invoke(dObj,flag,Type.DefaultBinder,parameters,null);

个人见解,反射用起来巨耗性能,可以称为是华丽的招数



查看完整回答
反对 回复 2021-11-23
  • 2 回答
  • 0 关注
  • 554 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信