Как динамически вызывать метод экземпляра объекта в 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();
}