2009-11-08 2 views
2

Так что у меня особое событие, как это:C# Пользовательские события с перегрузками

Work w = new worker() 
    w.newStatus += new worker.status(addStatus); 
    w.doWork(); 

    void addStatus(string status) 
    { 
     MessageBox.Show(status); 
    } 

и это:

public event status newStatus; 
    public delegate void status(string status); 

    public void doWork() 
    { 
     newStatus("Work Done");  
    } 

Если бы я был сделать «addStatus» перегрузку, что бы я должен выполнить перегрузку параметров без создания второго делегата/события?

+0

мне нужно больше информации. Когда вы говорите «make addStatus перегрузка», что вы имеете в виду? Вам нужна перегрузка, которая принимает другой набор параметров? –

+0

@Charlie: Я считаю, что это то, чего хочет OP. Например. 'addStatus (состояние строки)' и 'addStatus (статус строки, флаг bool)' –

+0

@Charlie Что означает o.k.w, то, что я имел в виду – Lienau

ответ

3

Сделайте свой status делегата родовым как это:

public event Status<String> NewStatus; 
public event Status<Int32> OtherStatus; 
public delegate void Status<T>(T status); 

public void DoWork() 
{ 
    NewStatus("Work Done"); 
    OtherStatus(42); 
} 

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

Edit: Вот полный пример, демонстрирующий это в действии:

using System; 

class Example 
{ 
    static void Main() 
    { 
     Work w = new Work(); 
     w.NewStatus += addStatus; 
     w.OtherStatus += addStatus; 
     w.DoWork(); 
    }  
    static void addStatus(String status) 
    { 
     Console.WriteLine(status); 
    } 
    static void addStatus(Int32 status) 
    { 
     Console.WriteLine(status); 
    } 
} 

class Work 
{ 
    public event Status<String> NewStatus; 
    public event Status<Int32> OtherStatus; 
    public delegate void Status<T>(T status); 

    public void DoWork() 
    { 
     NewStatus("Work Done"); 
     OtherStatus(42); 
    } 
} 
+0

Сначала меня смущало, почему вы предлагали использовать дженерики. Затем я внимательно прочитал вопрос OP и увидел, что «что мне нужно сделать для второго пользовательского события» можно понять двумя способами. Вы интерпретировали его как «то, что я должен был сделать, чтобы избежать вовлечения второго делегата» и дал отличный ответ на этот вопрос. Я предлагаю вам расширить свой ответ, чтобы было ясно, что вы будете использовать общий делегат, если вы не хотите использовать два отдельных типа делегатов, но вы могли бы так же легко использовать двух делегатов и не использовать дженерики. (Так что другие не будут смущены, поскольку я был сначала) –

+0

Это то же самое, что я делал, я просто хотел знать, есть ли способ передать параметры перегрузки по событию. – Lienau

+0

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

0
void addStatus(string status, int something) 
or 
    void addStatus(int status) 
or 
    void addStatus() 
should all work.