Допустим есть класс A
с без параметров метода экземпляраInvoke метод экземпляра статически
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
может быть любым методом экземпляра.
EDIT: Чтобы сделать вещи ясно:
Там нет статического метода в классе A
.
Существует метод без параметров, который называется foo
.
Я хочу вызвать (используя MethodInfo.Invoke
) foo
AS ЕСЛИ это статический метод, который принимает в качестве параметра класс 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
из методов экземпляра, прежде чем добавлять их в dict.
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
?
Последний EDIT: Нашел решение самостоятельно. Спасибо вам за помощь!
Вы можете вызвать статические методы с помощью первого метода. В случае статического метода первый параметр 'Invoke' игнорируется. – Donnie
@ Donnie Я не думаю, что он хочет вызвать статический метод. Он пытается вызвать метод экземпляра, как статический метод. –
@Donnie Я не хочу вызывать статический метод, я хочу вызвать метод экземпляра, используя второй подход –