代码之家  ›  专栏  ›  技术社区  ›  DanielLex

如何在c中动态调用实例化对象的方法#

  •  0
  • DanielLex  · 技术社区  · 11 年前

    我想创建一个方法,动态地(使用反射)调用实例化类的公共方法。

    首先,我要上课:

    namespace NFSe.Classes.Models.Classes.NFSeWeb
    {    
        public class Service
        {
            public string IdService { get; set; }
            public string Name {get; set; }
    
            public getKey()
            {
              return IdService + Name;      
            } 
        }
    }
    

    方法“getKey”将出现在几个类中。

    好吧,直到那里。。。但我正在创建一个函数,该函数返回函数的值 获取密钥 动态实例化的对象。

    我有一个函数,我将传递一个Object作为参数:

    internal static string getValorDaClasse(object valor)
    {
        if (valor.ToString().Contains("NFSe.Classes.Models.Classes"))
        {
            Type myType = Type.GetType(valor.ToString());
            object myObj = Activator.CreateInstance(myType);
    
            //Invoking a non-static method (How to invoke a non static method??)
    
            return (string)myType.InvokeMember("getKey", BindingFlags.InvokeMethod, null, myObj, new object[] { valor });
         }
         else
             return valor.ToString();
    }
    

    当我尝试这样做时(从方法中获取值) 获取密钥 “…我收到以下例外情况: 找不到方法“NFSe.Classes.Models.Classes.NFSeWeb.Service.getKey”。

    祝你一切顺利!

    3 回复  |  直到 11 年前
        1
  •  0
  •   crthompson Mandrake    11 年前

    你在打电话 InvokeMember 不正确。注意的最后一个参数 调用成员 ,你没有向 getKey ,所以null在那里是合适的。此外,绑定标志不允许您获得正确的方法。

    return (string)myType.InvokeMember("getKey", 
                                        BindingFlags.InvokeMethod|
                                             BindingFlags.Public | 
                                             BindingFlags.DeclaredOnly | 
                                             BindingFlags.Instance, 
                                        null, 
                                        myObj,
                                        null);
    

    您的服务方式:

    namespace NFSe.Classes.Models.Classes.NFSeWeb
    {
        public class Service
        {
            public string IdService { get; set; }
            public string Name { get; set; }
    
            public string getKey()
            {
                return IdService + Name;
            }
        }
    }
    

    您的调用方法:

    static void Main(string[] args)
        {
            var mystring = getValorDaClasse("NFSe.Classes.Models.Classes.NFSeWeb.Service");
        }
    
        public static string getValorDaClasse(object valor)
        {
            if (valor.ToString().Contains("NFSe.Classes.Models.Classes"))
            {
                Type myType = Type.GetType(valor.ToString());
                object myObj = Activator.CreateInstance(myType);
    
                //Invoking a non-static method (How to invoke a non static method??)
    
                return (string)myType.InvokeMember("getKey", BindingFlags.InvokeMethod|BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance, null, myObj, null);
            }
            else
                return valor.ToString();
        }
    
        2
  •  0
  •   Abdul Saleem k dimitrov    11 年前

    创建一个委托,将方法与委托一起引用,并将其作为参数传递。。

    让我向您展示一个使用代理的简单示例。。

    namespace DelimiterStage1
    {
        public delegate void MyDelegate();
        public partial class Form1 : Form
        {
    
    
            public Form1()
            {
                InitializeComponent();
                MyDelegate delg = new MyDelegate(catchup);
    
                new Form2(delg).Show();
            }
    
            private void catchup()
            {
                label1.Text = "Gotcha!";
            }
        }
    }
    

    表格2--

    namespace DelimiterStage1
    {
        public partial class Form2 : Form
        {
            public Form2(MyDelegate delgt)
            {
                InitializeComponent();
                delgate_Form2 = delgt;
            }
    
            MyDelegate delgate_Form2;
    
            private void button1_Click(object sender, EventArgs e)
            {
                delgate_Form2();
            }
        }
    }
    
        3
  •  0
  •   DanielLex    10 年前

    正确的答案是:

    return (string)myType.InvokeMember("getChave", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance, null, myObj, null);
    

    其中“getChave”是我要调用的函数的名称。