Вызов делегатов индивидуально? - PullRequest
6 голосов
/ 15 декабря 2010

если у меня есть такой делегат:

 Delegate void Render();
 Render ToRender;

И используйте его здесь:

 ToRender += FunctionRender;
 ToRender += SomeOtherRender;

Как я могу сделать так, чтобы я мог вызывать каждую функцию отдельно?Как то так:

 foreach(Render render in ToRender)
 {
     BeginRender();


     render();


     EndRender();
 }

Ответы [ 4 ]

12 голосов
/ 15 декабря 2010

Вы можете получить каждый из них отдельно, используя Delegate.GetInvocationList().

foreach (Render render in ToRender.GetInvocationList())
{
    ...
}

Обратите внимание, что GetInvocationList() просто возвращает Delegate[], но foreach имеет неявное приведение к каждому элементу, что и делает приведенный выше цикл.

Да, и вы должны проверить, является ли ToRender 1013 * или нет первым, конечно, иначе вы получите NullReferenceException. На самом деле вы могли бы написать общий метод расширения, чтобы сделать это лучше, но вам нужно ограничение на тип делегата, которое не разрешено в C #: (

Если вас не волнует отсутствие ограничений, вы можете подделать его:

public static IEnumerable<T> GetIndividualDelegates<T>(this T multiDelegate)
    where T : class
{
    if (multiDelegate == null)
    {
        yield break;
    }
    Delegate d = (Delegate)(object) multiDelegate;
    foreach (Delegate item in d.GetInvocationList())
    {
         yield return (T)(object) item;
    }    
}

(Это неудобно из-за ограничений на общие преобразования.)

Так вы могли бы написать:

foreach (Render render in ToRender.GetIndividualDelegates())
{
    ...
}

не беспокоясь о том, был ли ToRender нулевым или нет.

3 голосов
/ 15 декабря 2010
foreach (Render render in ToRender.GetInvocationList())

Идеальный путь:

Render temp = ToRender;

if (temp != null)
{
    foreach (Render render in temp.GetInvocationList())
    {
        BeginRender();

        render();

        EndRender();
    }
}
1 голос
/ 15 декабря 2010

ToRender.GetInvocationList возвращает массив всех делегатов, содержащихся в «списке».

0 голосов
/ 15 декабря 2010

это не так, как работают делегаты и события.все методы будут автоматически вызываться платформой.обработчики событий должны иметь возможность выполняться полностью независимо от любых других обработчиков.если вам нужно более жестко контролировать поток, вам следует подумать о том, чтобы изменить свой подход.

возможно 3 события / делегата - аналогично тому, как это делает asp.net.PreRender, Render и PostRender.Я не уверен, что ты делаешь, но это звучит как излишнее для меня.просто думал, что выкину это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...