【发布时间】:2015-09-14 05:27:52
【问题描述】:
假设有一个类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 AS IF 它是一个静态方法,以类A 作为参数。
EDIT2:为什么我想要这个:(帮助您更好地理解)
我有一个静态方法列表,它们对不同类型执行类似的工作,它们存储在字典 Dictionary<Type, MethodInfo> dict 中。
因此,每当我有一个对象obj 并想做这项工作时,我都可以
dict[obj.GetType()].Invoke(null, new object[] { obj, param1, param2, ... });
现在我也想在其中添加实例方法,但这需要我记住哪些方法是静态的,哪些方法是实例绑定的,并以不同的方式调用它们:
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:我不明白为什么这个问题被标记为重复。链接页面没有回答我的问题。如果我遗漏了什么,请告诉我。
链接页面有几个答案,但它们要么
- 要求我知道
foo需要多少个参数,或者 - 提供了一个以
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 的第一个参数?
上次编辑:自己找到了解决方案。谢谢你们的帮助!
【问题讨论】:
-
您可以使用第一个方法调用静态方法。在静态方法的情况下,
Invoke的第一个参数被忽略。 -
@Donnie 我不认为他想调用静态方法。他尝试像静态方法一样调用实例方法。
-
@Donnie 我不想调用静态方法,我想要的是使用第二种方法调用实例方法
-
像调用静态方法一样调用方法 这到底是什么意思?您尝试调用的方法实际上是静态的还是您根本不想创建
A的实例? -
Here's an example 你可以做的一件事
标签: c# reflection