当前位置: 代码迷 >> C# >> c# delegate函数 加载 字符串类型的函数名,该如何解决
  详细解决方案

c# delegate函数 加载 字符串类型的函数名,该如何解决

热度:430   发布时间:2016-05-05 03:35:37.0
c# delegate函数 加载 字符串类型的函数名
自定义类 
MYCLASS
{
public delegate void DelegateLoginMethod);  //声明了一个Delegate Type
 public DelegateLoginMethod _delegateLoginMethod;

          function1();
           function2();
            ....
}

在主窗体中,  我将  WebSitesLoginAndReqestClass 类中方法 绑定在 下拉 框comboBox1中
Type ht = typeof(MYCLASS);
            MethodInfo[] mif = ht.GetMethods(BindingFlags.DeclaredOnly|BindingFlags.Instance|BindingFlags.Public);
            foreach (MethodInfo mf in mif)
            {
                
                comboBox1.Items.Add(mf.Name);
                 
            }

我想达到 这样的效果,,comboBox1变化选择目标的时候
MYCLASS类中的delegate 动态加载 MYCLASS类中 的函数 

目前我是这样做的...

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
           string strFunction  =  comboBox1.selectitem.tostring();
            MYCLASS  logicClass = new MYCLASS();
    
            MYCLASS._delegateLoginMethod += new MYCLASS.DelegateLoginMethod(     
上面这句写不下去了...求解...
        }
------解决思路----------------------
反射获取Method,然后Invoke
var person = new Person();
var method = person.GetType().GetMethod("");
person.delegateLoginMethod += () =>
{
      method.Invoke(person, null);
};
public class Person
        {
            public delegate void DelegateLoginMethod();
            public DelegateLoginMethod delegateLoginMethod;
        }

------解决思路----------------------
反射获取Method,然后Invoke
------解决思路----------------------
楼主的想法是可行的,需要注意一些问题
如果MYCLASS只是定义在方法中,那方法结束后选择的结果不就消失了么.
选择的结果如果是字符串,应该根据该字符串重新获取对应的方法加入到委托中.
还要考虑多次选择后,是否委托中允许加入多个方法,同个方法是否可加入多次.

------解决思路----------------------
要进行所谓的”动态加载委托执行方法,也就是这样写
if (selectValue == "1")
{
    person.delegateLoginMethod += e =>
    {
        function1(e);
    };
}
else if (selectValue == "2")
{
    person.delegateLoginMethod += e =>
    {
        function2(e);
    };
}

或者简写为
if (selectValue == "1")
{
    person.delegateLoginMethod += function1;
}
else if (selectValue == "2")
{
    person.delegateLoginMethod += function2;
}

任何适配于 delegateLoginMethod 事件接口形式的方法都可以使用。包括你可以写 
person.delegateLoginMethod += person.function3;
 也就是再次去调用 person的某个方法。用不着什么反射。
------解决思路----------------------
MYCLASS._delegateLoginMethod += new MYCLASS.DelegateLoginMethod((a, b) => 你反射的方法.Invoke(new object[] { a, b}) )
  相关解决方案