2 回答
TA贡献2021条经验 获得超8个赞
将反射创建的对象赋值给obj。然后obj.GetType().GetField("SetProgress")获得指定字段,再赋值。
Object obj=Assembly.Load("xx").CreateInstance("xx.FrmLog ");
FieldInfo fi = obj.GetType().GetField("SetProgress");
if (fi.IsPublic == true)
{
fi.SetValue(obj, new SetDelegate(SetStatus));
}
TA贡献1811条经验 获得超5个赞
using System;
using System.Reflection;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
SetDelegate sd = null;
private void button1_Click(object sender, EventArgs e)
{
var _Assembly = Assembly.LoadFile(Application.StartupPath + "\\WindowsFormsApplication1.exe");
var _Type = _Assembly.GetType("WindowsFormsApplication1.Form2");
var _Instance = _Type.InvokeMember(string.Empty, BindingFlags.CreateInstance, null, null, null);
sd += new SetDelegate(SetStatus);
sd += new SetDelegate(SetStatus2);
var _Event = _Type.GetField("SetProgress");
_Event.SetValue(_Instance, sd); // 向事件中添加方法
_Type.InvokeMember("ShowDialog", BindingFlags.InvokeMethod, null, _Instance, null); // 显示窗体2
}
private void SetStatus(MyProgress _MyProgress)
{
_MyProgress.iProgressValue = 3;
}
private void SetStatus2(MyProgress _MyProgress)
{
_MyProgress.iProgressValue = 42;
}
}
}
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
public SetDelegate SetProgress;
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
MyProgress mp = new MyProgress();
mp.iProgressValue = 0;
SetProgress(mp);
MessageBox.Show(mp.iProgressValue.ToString());
}
}
public delegate void SetDelegate(MyProgress iProgressValue);
public class MyProgress
{
public int iProgressValue = 0;
}
}
差不多就这样,找到form2中定义的属性。
或者采用接口的方式,让Form2实现IMyForm接口,然后获取实例后强转为接口对象就可以了
添加回答
举报