2013-12-25 4 views
0

Я новичок в C# и программировании в целом и пытаюсь выяснить, как использовать события. Раньше я программировал ActionScript3, и там события представляют собой специальный класс, который вы наследуете, если вы хотите создать свои собственные события, а затем это событие может быть вызвано любым другим классом.Вызывающее событие другого класса

С # Я пытался сделать что-то подобное, например, так:

public class EventManager 
{ 
    public delegate void TempDelegate(); 
    public static event TempDelegate eSomeEvent; 
} 

public class SomeOtherClass 
{ 
    //doing some stuff, then: 
    if (EventManager.eSomeEvent != null) 
    { 
     EventManager.eSomeEvent(); 
    } 
} 

Это дает мне CS0070 ошибки компилятора: события «EventManager.eSomeEvent» может появиться только на левой стороне + = или - = (кроме случаев, когда они используются внутри типа EventManager)

Информация об этой ошибке выше на msdn указывает, что я должен использовать += вместо того, чтобы пытаться вызвать событие, но я действительно не понимаю этого , Я не пытаюсь подписаться на что-либо от SomeOtherClass делегату мероприятия, я просто пытаюсь вызвать это событие, чтобы он начал выполнять те функции, которые уже подписаны на это событие.

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

Любые советы с этим были бы очень благодарны!

+0

Я немного неясно. Вы хотите пузырить события из одного класса и передавать их через другой класс (который имеет этот класс)? Или вы просто пытаетесь копировать события через несколько классов (например, библиотеку событий)? – SQLMason

+1

http://stackoverflow.com/questions/756237/c-raising-an-inherited-event – SQLMason

ответ

1

Ну, типичное решение поставить eSomeEvent вызов в EventManager класса

public class EventManager 
{ 
    public delegate void TempDelegate(); 
    public static event TempDelegate eSomeEvent; 

    // Not thread safe as well as your code 
    // May be internal, not public is better (if SomeOtherClass is in the same namespace) 
    public static void PerformSomeEvent() { 
     if (!Object.ReferenceEquals(null, eSomeEvent)) 
     eSomeEvent(); // <- You can do it here 
    } 
} 

public class SomeOtherClass 
{ 
    //doing some stuff, then: 
    EventManager.PerformSomeEvent(); 
} 
+0

Да, это то, о чем я думал, спасибо. –

3

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

public void OnSomeEvent() 
{ 
    var handler = eSomeEvent; 
    if (handler != null) handler(this, null); 
} 

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

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