静态调用实例方法

时间:2015-09-14 05:27:52

标签: c# reflection

假设有一个带有无参数实例方法的类dbadapter = new MyDBAdapter(this); getDetail();

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的无参数实例方法。

我想调用(使用fooMethodInfo.Invoke AS如果它是静态方法,则将类foo作为参数。

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

我有一个静态方法列表,它们针对不同类型执行类似的工作,它们存储在字典A中。

因此,每当我有一个对象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 ,然后再将它们添加到dict中。

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

链接页面有几个答案,但它们都是

  1. 要求我知道MethodInfo需要多少参数,或
  2. 提供了一种方法,该方法以foo为参数,而不是参数列表。
  3. 所以它们都不适合这里。

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

    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 作为参数。但问题是,既然我不知道foo是怎样的,我怎么能传递new object[] { a }的第一个参数?

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

1 个答案:

答案 0 :(得分:-1)

静态方法和实例方法可以通过创建委托统一,然后调用DynamicInvoke

Dictionary<Type, Delegate> dict = new Dictionary<Type, Delegate>();

void AddMethod(Type type, String methodName)
{
    var method = type.GetMethod(methodName);
    var types = method.GetParameters().ConvertAll(p => p.ParameterType).ToList();
    if (!method.IsStatic)
        types.Insert(0, type);
    types.Add(method.ReturnType);
    var delegType = Expression.GetFuncType(types.ToArray());
    var deleg = method.CreateDelegate(delegType);
    dict.Add(type, deleg);
}

object GetJobResult(object obj, params object[] additionalParams)
{
    var paramList = additionalParams.ToList();
    paramList.Insert(0, obj);
    return dict[obj.GetType()].DynamicInvoke(paramList.ToArray());
}