gpt4 book ai didi

c# - 静态调用实例方法

转载 作者:太空狗 更新时间:2023-10-29 21:38:45 25 4
gpt4 key购买 nike

假设有一个类 A使用无参数实例方法

class A
{
public A(int x) { this.x = x; }
private int x;
public int foo() { return x; }
}

使用反射调用方法很容易:

A a = new A(100);
var method = typeof(A).GetMethod("foo");
var result = method.Invoke(a, new object[0]); // 100

但是,我想像调用静态方法一样调用该方法

var staticmethod = Something(typeof(A), "foo");
var result = staticmethod.Invoke(null, new object[] { a });

有什么办法可以得到这个 staticmethod

注意:我想要 Something是通用的,即 A可以是任何类,并且 foo可以是任何实例方法。

编辑:为了弄清楚:

类中没有静态方法A .

有一个无参数实例方法叫做foo .

我想调用(使用 MethodInfo.Invoke )foo好像它是一个静态方法,采用类 A作为参数。

EDIT2:为什么我想要这个:(帮助您更好地理解)

我有一个静态方法列表,它们为不同的类型做类似的工作,它们存储在字典中 Dictionary<Type, MethodInfo> dict .

因此,每当我有一个对象 obj并且想做这份工作,我可以

dict[obj.GetType()].Invoke(null, new object[] { obj, param1, param2, ... });

现在我也想在其中添加实例方法,但这需要我记住哪些方法是静态的,哪些方法是实例绑定(bind)的,并以不同的方式调用它们:

dict[obj.GetType()].Invoke(null, new object[] { obj, param1, param2, ... }); // static methods
dict[obj.GetType()].Invoke(obj, new object[] { param1, param2, ... }); // instance methods

这很不方便。所以我想获得静态 MethodInfo来自实例方法,然后将它们添加到字典中。

EDIT3:我不明白为什么这个问题被标记为重复。链接页面没有回答我的问题。如果我遗漏了什么,请告诉我。

链接页面有几个答案,但他们要么

  1. 要求我知道有多少参数 foo需要,或者
  2. 给出了一个方法,它接受 object[]作为参数,而不是参数列表。

所以他们都不适合这里。

经过一些研究,我发现有一些东西接近我的需要:

 A a = new A(100);
var method = typeof(A).GetMethod("foo");
var deleg = Delegate.CreateDelegate(typeof(Func<A, int>), method)
var result = deleg.DynamicInvoke(new object[] { a }); // 100

在这里,它需要 new object[] { a }作为论据。但问题是,因为我不知道 foo 长什么样,我怎么能传递 Delegate.CreateDelegate 的第一个参数呢? ?

上次编辑:我自己找到了解决方案。谢谢你们的帮助!

最佳答案

but it will require me to remember which methods are static and which methods are instance-bond, and invoke them in different ways

不需要记住它,因为方法本身知道:

MethodInfo mi = GetTheMethodFromSomewhere();
object[] args = new object[] { obj, param1, param2, … };
if (mi.IsStatic)
mi.Invoke(null, args);
else
mi.Invoke(args[0], args.Skip(1).ToArray());

关于c# - 静态调用实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32557816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com