Объявление делегата в основном объявляет подпись метода , которая включает только информацию о его параметрах и типе возвращаемого значения.А поскольку один и тот же делегат может указывать как на статические, так и на методы экземпляров, не имеет смысла делать саму сигнатуру метода статической или экземпляром.
Как только вы объявили свой делегат как:
public delegate void MoveDelegate (Actor sender, MoveDirection args);
это означает, что любой делегат этого типа должен указывать на метод, который принимает один Actor
параметр, один MoveDirection
параметр и возвращает void
, независимо от того, является ли метод статическим илипример.Вы можете объявить делегат в области пространства имен или внутри класса (точно так же, как вы бы объявили вложенный класс).
Таким образом, после объявления где-то MoveDelegate
вы можете создавать поля и переменные этого типа:
private MoveDelegate _myMoveDelegate;
и помните, что метод должен иметь соответствующую подпись:
// parameters and return type must match!
public void Move(Actor actor, MoveDirection moveDir)
{
ProcessMove (moveDir);
}
public static void MoveStatic(Actor actor, MoveDirection moveDir)
{
ProcessMove (moveDir);
}
, тогда вы можете назначить этот метод делегату в другом месте:
private void SomeOtherMethod()
{
// get a reference to the Move method
_myMoveDelegate = Move;
// or, alternatively the longer version:
// _myMoveDelegate = new MoveDelegate(Move);
// works for static methods too
_myMoveDelegate = MoveStatic;
// and then simply call the Move method indirectly
_myMoveDelegate(someActor, someDirection);
}
Полезно знать, что .NET (начиная с версии v3.5) предоставляет несколько предопределенных универсальных делегатов (Action
и Func
), которые можно использовать вместо объявления ваших собственных делегатов :
// you can simply use the Action delegate to declare the
// method which accepts these same parameters
private Action<Actor, MoveDirection> _myMoveDelegate;
Использование этих делегатов ИМХО более читабельно, поскольку вы можете сразу определить сигнатуру параметров, глядя на самого делегата (в то время как в вашем случае нужноищите декларацию).