Как динамически вызывать метод экземпляра объекта в C#

Я хочу создать метод, который будет вызывать публичный метод экземпляра класса, динамически (используя отражение).

Во-первых, у меня есть свой класс:

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' не найден.

Всего наилучшего!

3 ответа

Решение

Правильный ответ таков:

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

где "getChave" - это имя функции, которую я хочу вызвать.

Создайте делегат, обратитесь к методу с делегатом и передайте его в качестве параметра.

Позвольте мне показать вам простой пример использования делегатов.

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

Ты звонишь InvokeMember неправильно. Обратите внимание на последний параметр InvokeMember, Вы ничего не передаете в getKey, так что там будет NULL. Кроме того, флаги привязки werent позволяют вам получить правильный метод.

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();
    }
Другие вопросы по тегам