如何在c#中动态调用即时对象的方法

时间:2013-09-04 17:54:03

标签: c# methods system.reflection non-static

我想创建一个方法,动态地(使用反射)调用即时类的公共方法。

首先,我有我的班级:

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。

一切顺利!

3 个答案:

答案 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"是我想要调用的函数的名称。