如何在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'。
祝你一切顺利!
您错误地调用了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"是我要调用的函数的名称。