我想创建一个方法,动态地(使用反射)调用即时类的公共方法。
首先,我有我的班级:
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 的值。
我有一个函数,我将传递一个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();
}
当我尝试这样做时(从方法“ getKey ”获取值...)我收到以下异常:方法'NFSe.Classes.Models.Classes.NFSeWeb。找不到Service.getKey。
一切顺利!
答案 0 :(得分:0)
您正在正确呼叫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();
}
答案 1 :(得分:0)
创建委托,使用委托引用方法并将其作为参数传递..
让我向您展示一个使用委托的简单示例..
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!";
}
}
}
Form2 -
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();
}
}
}
答案 2 :(得分:0)
正确的答案是:
return (string)myType.InvokeMember("getChave", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance, null, myObj, null);
其中" getChave"是我想要调用的函数的名称。