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

本文关键字:实例化 对象 方法 调用 动态 | 更新日期: 2023-09-27 18:30:07

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

首先,我有我的课:

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"将出现在几个类中。

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

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

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();
}

当我尝试这样做时(从方法"getKey"获取值……我收到以下异常:未找到方法'NFSe.Classes.Models.Classes.NFSeWeb.Service.getKey'。

祝你一切顺利!

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

您错误地调用了InvokeMember。注意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();
    }

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

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

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();
        }
    }
}

正确答案是:

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

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