0

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

首先,我有我的课:

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'。

祝一切顺利!

4

3 回答 3

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();
    }
于 2013-09-04T18:11:54.263 回答
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!";
        }
    }
}

表格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();
        }
    }
}
于 2013-09-04T18:19:11.930 回答
0

正确答案是这样的:

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

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

于 2014-10-22T12:53:58.710 回答