Мне интересно, возможно ли (и какой синтаксис) отправить метод объекта функции.
Пример:
Object "myObject" has two methods "method1" and "method2"
Я хотел бы иметь функцию по строкам:
public bool myFunc(var methodOnObject)
{
[code here]
var returnVal = [run methodOnObject here]
[code here]
return returnVal;
}
Так что в другой функции я мог бы сделать что-то вроде
public void overallFunction()
{
var myObject = new ObjectItem();
var method1Success = myFunc(myObject.method1);
var method2Success = myFunc(myObject.method2);
}
Есть ли необходимость в явных делегатах? Возможно, этот подход поможет вам:
private class MyObject
{
public bool Method1() { return true; } // Your own logic here
public bool Method2() { return false; } // Your own logic here
}
private static bool MyFunction(Func<bool> methodOnObject)
{
bool returnValue = methodOnObject();
return returnValue;
}
private static void OverallFunction()
{
MyObject myObject = new MyObject();
bool method1Success = MyFunction(myObject.Method1);
bool method2Success = MyFunction(myObject.Method2);
}
Func<...>
очень это delegate
.
Да, вам нужно использовать делегат. Делегаты довольно аналогичны указателям на функции в C/С++.
Сначала вам нужно объявить подпись делегата. Скажем, у меня есть эта функция:
private int DoSomething(string data)
{
return -1;
}
Объявление делегата будет...
public delegate int MyDelegate(string data);
Затем вы можете объявить myFunc таким образом.
public bool myFunc(MyDelegate methodOnObject)
{
[code here]
int returnValue = methodOnObject("foo");
[code here]
return returnValue;
}
Затем вы можете вызвать его одним из двух способов:
myFunc(new MyDelegate(DoSomething));
Или, в С# 3.0 и более поздних версиях, вы можете использовать стенографию...
myFunc(DoSomething);
(Он просто завершает предоставленную функцию в конструкторе по умолчанию для этого делегата автоматически. Вызовы функционально идентичны).
Если вы не хотите создавать делегат или реализацию фактической функции для простых выражений, в С# 3.0 также будет работать следующее:
public bool myFunc(Func<string, int> expr)
{
[code here]
int returnValue = methodOnObject("foo");
[code here]
return returnValue;
}
Что тогда можно было бы назвать так:
myFunc(s => return -1);
Func<string, int>
который представляет ту же сигнатуру, что и ваш тип MyDelegate
.
Да, используя делегатов..
Вот пример.
delegate string myDel(int s);
public class Program
{
static string Func(myDel f)
{
return f(2);
}
public static void Main()
{
Test obj = new Test();
myDel d = obj.func;
Console.WriteLine(Func(d));
}
}
class Test
{
public string func(int s)
{
return s.ToString();
}
}