C#使用Invoke如何执行静态类中的静态方法?

2020-05-19 13:50发布

例:public static class JsonConvert{...public static T DeserializeObject < T> (string value);...}使用反射调...

例:public static class JsonConvert{

...

public static T DeserializeObject < T> (string value);

...

使用反射调用此方法。

Invoke(...);要传入一个实例参数,但静态类无法实例化。

InvokeMember(..);不知道怎么指定泛型的类型。而且无法精确定位到此方法(有多个同名方法)。

请问如何解决?


4条回答
Ross
2楼 · 2020-05-19 16:20

自己测试了一下,使用反射机制,可以调用类里面的静态方法,但是没有找到好的办法调用泛型静态方法,自己测试的代码如下:

 class Person

    {

        public static string Fun(string value)

        {

            Console.WriteLine("ttt");

            return value;

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            //使用反射机制得到指定类里面的方法

            Type t = typeof(Person);

            MethodInfo info = t.GetMethod("Fun");

            Console.WriteLine(info.Name);

            Person p = new Person();

            //使用Invoke方法进行回调

           object obj= info.Invoke(null,new string[] {"zhangsan"});

            //打印的结果是"zhangsan",即调用方法的返回值

            Console.WriteLine(obj);

            Console.ReadLine();

            

        }

    }

到网上查了一下,也查不到相关的内容,希望上面的代码能帮到你.

男孩无衣
3楼 · 2020-05-19 15:59

这是功能性的不行

我试了一下, 即便使用委托也无法在Invoke中异步发起泛型和多参方法。


水平所限,望高人指点。 


废话不多说直接上代码:

using System;

using System.Reflection;


namespace ConsoleApp1

{

    class Player

    {

        public Player() { }

        public string Name { get; set; }

        public override string ToString()

        {

            return Name;

        }

    }

    class JsonConvert

    {

        public static T DeserializeObject(string value) where T:new()

        {

            Console.WriteLine(value);

            return new T();

        }

    }


    class Program

    {

        static void Main(string[] args)

        {

            Type t = typeof(JsonConvert);

            MethodInfo info = t.GetMethod("DeserializeObject");

            info = info.MakeGenericMethod(typeof(Player));

            Player player = info.Invoke(null, new string[] { "第1个玩家" }) as Player;

            player.Name = "水月花";

            Console.WriteLine(player);

        }

    }

}

运行输出:

image.png

PS划重点:使用MakeGenericMethod生成对应的泛型方法,如果是静态方法invoke第1个参数传null就可以。

小狮子
5楼 · 2020-05-25 10:52

using System.Threading;


       public delegate void MyInvoke(string str);//invoke方法创建委托

        private void btnStartThread_Click(object sender, EventArgs e)

        {

            Thread thread = new Thread(new ThreadStart(DoWord));

            thread.Start();

        }

        public void DoWord()

        {            

            MyInvoke mi = new MyInvoke(SetTxt);//实例化一个委托,并且指定委托方法

            BeginInvoke(mi,new object[]{"abc"}); //调用invoke方法           

        }


        public void SetTxt(string str)//委托对应的方法

        {

            txtReceive.Text += "invoke";

        }




this.listView1.Invoke(new EventHandler(delegate

 {

          listView1.Items.RemoveAt(i);

  }));


希望可以帮助到你

相关问题推荐

没有解决我的问题,去提问