猿问

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

已知:
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;如果没有,则实例化,然后修改name

if (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对应的窗体类实例,
调用里面的方法
设置某些成员的属性。
}

PIPIONE
浏览 557回答 2
2回答

互换的青春

用反射:主调类: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();}}

智慧大石

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.AssemblyAssembly 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);个人见解,反射用起来巨耗性能,可以称为是华丽的招数
随时随地看视频慕课网APP
我要回答