pwither.ev
1.0.4
dotnet add package pwither.ev --version 1.0.4
NuGet\Install-Package pwither.ev -Version 1.0.4
<PackageReference Include="pwither.ev" Version="1.0.4" />
paket add pwither.ev --version 1.0.4
#r "nuget: pwither.ev, 1.0.4"
// Install pwither.ev as a Cake Addin #addin nuget:?package=pwither.ev&version=1.0.4 // Install pwither.ev as a Cake Tool #tool nuget:?package=pwither.ev&version=1.0.4
pwither.ev - Решение для вызова событий (методов) из статического класса или использования наследования от класса скрипта с использованием атрибутов для платформы .NET 8.0
Документация
Атрибуты
Вы можете присваивать своим методам атрибуты события при помощи стандартного атрибута LocalEvent, он стандартно использует для идентификации событий string:
[LocalEvent(<eventId>)]
public void SomeMethod()
{
//some code
}
Также можно использовать атрибут, в котором Id события представлен обобщенным типом (Generics), создадим для демонстрации перечисление SomeEnum:
enum SomeEnum
{
One,
Two,
Three
}
[GenericEvent<SomeEnum>(<eventId>)]
public void SomeMethod()
{
//some code
}
Использовать GenericEvent не всегда удобно, поэтому возможно создать свой атрибут с уже приведенным универсальным типом:
enum SomeEnum
{
One,
Two,
Three
}
internal class EnumEventAttribute : GenericEventAttribute<SomeEnum>
{
public EnumEventAttribute(SomeEnum id) : base(id)
{
}
}
[EnumEvent(<eventId>)]
public void SomeMethod()
{
//some code
}
Срипты
Для вызова методов могут использоваться как статические классы, так и скрипты. Для LocalEvent используется стандартный класс EventScript:
public class SomeClass : EventScript
{
[LocalEvent(<eventId>)]
public void SomeMethod()
{
//some code
}
}
Пример вызова события для EventScript:
var obj = new SomeClass();
obj.InvokeEvent(<eventId>);
Для универсальных типов используется GenericEventScript:
enum SomeEnum
{
One,
Two,
Three
}
public class SomeClass : GenericEventScript<SomeEnum>
{
[GenericEvent<SomeEnum>(<eventId>)]
public void SomeMethod()
{
//some code
}
}
Но это также не всегда удобно, поэтому можно использовать наследование:
public class EnumEventScript : GenericEventScript<SomeEnum>
{
}
internal class SomeClass : EnumEventScript
{
[EnumEvent(<eventId>)]
public void SomeMethod()
{
//some code
}
}
Медоты, имеющие параметры вызываются следующим образом:
public class SomeClass : EventScript
{
[LocalEvent("someId")]
public void SomeMethod(int someArg)
{
Console.WriteLine(someArg);
}
}
var obj = new SomeClass();
//передача параметров осуществляется через InvokeEvent:
obj.InvokeEvent("someId", 1); //output 1
obj.InvokeEvent("someId", 2); //output 2
obj.InvokeEvent("someId", 3); //output 3
Это также применимо для любого количества параметров и любого типа скриптов.
Статические диспетчеры
С помощью диспетчеров можно регистрировать методы объекта и вызывать их из любой точки программы без использования скриптов. Существует 2 диспетчера - для LocalEventAttribute и для GenericEventAttribute: EventDispatcher и GenericEventDispatcher соответственно. Для GenericEventDispatcher можно создавать свои объекты, и пользоваться ими из него. Пример использования EventDispatcher:
public class SomeClass
{
[LocalEvent("someId")]
public void SomeMethod()
{
//some code
}
[LocalEvent("output")]
public void OutputMethod(int someArg)
{
Console.WriteLine(someArg);
}
}
var obj = new SomeClass();
EventDispatcher.Register(obj);
EventDispatcher.Invoke("someId");
EventDispatcher.Invoke("output", 1); //output 1
EventDispatcher.Invoke("output", 2); //output 2
EventDispatcher.Unregister(obj);
Пример использования GenericEventDispatcher:
enum SomeEnum
{
One,
Two,
Three
}
public class SomeClass
{
[GenericEvent<SomeEnum>(SomeEnum.One)]
public void SomeMethod()
{
//some code
}
[GenericEvent<SomeEnum>(SomeEnum.Two)]
public void OutputMethod(int someArg)
{
Console.WriteLine(someArg);
}
[GenericEvent<SomeEnum>(SomeEnum.Three)]
public void OutputMethod(int someArg1, string someArg2)
{
Console.WriteLine(someArg1 + someArg2);
}
}
var obj = new SomeClass();
GenericEventDispatcher<SomeEnum>.Register(obj);
GenericEventDispatcher<SomeEnum>.Invoke(SomeEnum.One);
GenericEventDispatcher<SomeEnum>.Invoke(SomeEnum.Two, 1); //output 1
GenericEventDispatcher<SomeEnum>.Invoke(SomeEnum.Three, 1, "someText"); //output 1someText
GenericEventDispatcher<SomeEnum>.Unregister(obj);
Пример использования наследуемых классов, включая диспетчера:
enum SomeEnum
{
One,
Two,
Three
}
public class EnumDispatcher : GenericEventDispatcher<SomeEnum>
{
}
public class EnumEventAttribute : GenericEventAttribute<SomeEnum>
{
public EnumEventAttribute(SomeEnum id) : base(id)
{
}
}
public class SomeClass
{
[EnumEvent(SomeEnum.One)]
public void SomeMethod()
{
//some code
}
[EnumEvent(SomeEnum.Two)]
public void OutputMethod(int someArg)
{
Console.WriteLine(someArg);
}
[EnumEvent(SomeEnum.Three)]
public void OutputMethod(int someArg1, string someArg2)
{
Console.WriteLine(someArg1 + someArg2);
}
}
var obj = new SomeClass();
EnumDispatcher.Register(obj);
EnumDispatcher.Invoke(SomeEnum.One);
EnumDispatcher.Invoke(SomeEnum.Two, 1); //output 1
EnumDispatcher.Invoke(SomeEnum.Three, 1, "someText"); //output 1someText
EnumDispatcher.Unregister(obj);
Методы любого диспетчера сводятся к:
public static void Register(object handler) //регистрирует объект в системе
public static void Unregister(object handler) //удаляет объект из системы
public static void UnregisterAll() //удаляет все объекты из системы
public static void RegisterByEventId(object handler, string id) //регистрирует объект для идентификатора определенного события
public static void UnregisterByEventId(object handler, string id) //удаляет объект для идентификатора определенного события
public static void UnregisterAllByEventId(string id) //удаляет все объекты, присущие определенному идентификатору события
public static void Invoke(string id, params object[] eventArgs) //вызывает собитие
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net7.0
- No dependencies.
NuGet packages (2)
Showing the top 2 NuGet packages that depend on pwither.ev:
Package | Downloads |
---|---|
pwither.net.server
A solution for creating TCP-based multithreaded servers |
|
pwither.net.client
A solution for creating TCP-based clients |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.0.4 | 120 | 3/22/2024 |