2015-09-22 2 views
2

У меня есть класс, определяющий несколько функций, с той же подписьюВызвать метод, передаваемый в качестве параметра на объект передается в качестве параметра

public class MyClass 
{ 
    public string MyParam1() ... 
    public string MyParam2() ... 
    ... 
} 

Из другого класса я хочу вызвать метод, передаваемый в качестве параметра на объект передается в качестве параметр

void MyFunction(MyClass anObject, Func<string> aMethod) 
{ 
    string val = ??? // Here call aMethod on anObject 
} 

Я уверен, что это возможно сделать с помощью отражения, но есть ли трудный способ сделать это?

На самом деле у меня есть набор объектов, а не один объект, поэтому я не могу напрямую вызвать метод объекта.

+0

Возможный дубликат [Получить только методы с определенной подписью из Type.GetMethods()] (http://stackoverflow.com/questions/5152346/get-only-methods-with-specific-signature-out-of-of- type-getmethods) –

+1

Не совсем понятно, что вы здесь задаете. Делегат уже знает, к какому экземпляру он должен быть вызван. Вы можете вызвать свою «MyFunction» следующим образом: «MyFunction (someObject,() =>« test »);' в этом случае переданный делегат не из или из 'someObject', что бы вы ожидали здесь? –

+0

Прошу прощения, я постарался сделать вопрос как можно более простым, и я пропустил указать одну трудность. На самом деле мой первый параметр - это набор объектов, и я хочу вызвать тот же метод для каждого объекта. – user2223898

ответ

0

Вам не нужно беспокоиться о том, как anObjectaMethodуже привязан к экземпляру. Определение делегата состоит в том, что это reference to an instance of a method.

Поэтому следующее должно хватить:

void MyFunction(Func<string> aMethod) 
{ 
    string val = aMethod(); 
} 
3

Если вы передаете метод экземпляра как функции, он уже связан с экземпляром, так что ваш anObject бесполезно в этом случае.

Этот код уже работает на this:

MyFunction(null, this.DoSomething); 

Здесь val всегда будет результатом this.DoSomething в контексте вызывающего абонента:

string val = aMethod(); 

Что вы можете сделать вместо передачи экземпляра метод вокруг, создает статический метод, который имеет параметр для anObject. Таким образом, ваш статический метод может выполнять конкретные задачи конкретного экземпляра.

public string MyParam2(MyClass instance) { } 

void MyFunction(MyClass anObject, Func<MyClass, string> aMethod) 
{ 
    string val = aMethod(anObject); 
} 
0

Если вы действительно хотите вызвать данный метод на объекте, то не используйте Func но передайте объект и имя метода:

class Test 
{ 
    public static void SayHello() 
    { 
     Console.WriteLine("Hello"); 
    } 
} 

void Main() 
{ 
    var t = new Test(); 
    var methodInfo = t.GetType().GetMethod("SayHello"); 
    methodInfo.Invoke(t, null); 

} 

При выполнении этой воли печать

Hello 

, как он будет вызывать SayHello метод на Test экземпляра t.

Смежные вопросы