LiteWare.ObjectInvokers
0.2.0
dotnet add package LiteWare.ObjectInvokers --version 0.2.0
NuGet\Install-Package LiteWare.ObjectInvokers -Version 0.2.0
<PackageReference Include="LiteWare.ObjectInvokers" Version="0.2.0" />
<PackageVersion Include="LiteWare.ObjectInvokers" Version="0.2.0" />
<PackageReference Include="LiteWare.ObjectInvokers" />
paket add LiteWare.ObjectInvokers --version 0.2.0
#r "nuget: LiteWare.ObjectInvokers, 0.2.0"
#:package LiteWare.ObjectInvokers@0.2.0
#addin nuget:?package=LiteWare.ObjectInvokers&version=0.2.0
#tool nuget:?package=LiteWare.ObjectInvokers&version=0.2.0
LiteWare.ObjectInvokers
LiteWare.ObjectInvokers allows you to dynamically invoke methods and modify properties or fields at runtime by specifying the member's name, for example:
ObjectInvoker objectInvoker = ObjectInvoker.Bind<IIotHub>(iotHub);
objectInvoker.Invoke("InitializeIotHub", "HUB01", MaxDeviceCout);
Events can also be monitored, for example:
using EventListener eventListener = EventListener.Bind<IIotHub>(iotHub, eventNotifier);
eventListener.StartListening();
This library is useful in scenarios where an external system wants to dynamically invoke or listen for events of an internal object.
Usage
Start by defining a contract type containing the members to invoke and/or the events to listen to:
public interface IMyService
{
[Listenable]
event EventHandler MyEvent;
[Invokable]
int MyProperty { get; set; }
[Invokable]
void MyProcedure();
[Invokable("MyFunction")]
int SomeFunction(int arg);
}
The contract type is not limited to only interfaces and can be of any type.
However, it must either have members qualified by the InvokableAttribute or ListenableAttribute or a predicate must be provided during binding
to select wanted members.
InvokableAttribute and ListenableAttribute can also be applied on private members.
ObjectInvoker
Dynamic invoke of methods and modification of properties or fields is done by the ObjectInvoker.Invoke method,
which accepts a member name and any generic types and/or parameters and redirects the call to a concrete object.
An instance of ObjectInvoker is created by binding a contract type containing the members to invoke to an instance of the contract:
ObjectInvoker objectInvoker = ObjectInvoker.Bind<IMyService>(myService);
Depending on the underlying concrete object member, the invoke process can:
Invoke a method and return the result if the member is a method:
bool? success = objectInvoker.Invoke("SetLightSwitchState", "SW012", LightSwitchState.On) as bool?;Get or set a property if the member is a property:
string? id = objectInvoker.Invoke("DeviceId") as string?; // Property getter objectInvoker.Invoke("DeviceDescription", "Livingroom light switch"); // Property setterGet or set a field value if the member is a field:
int? timeout = objectInvoker.Invoke("Timeout") as int?; // Get field value objectInvoker.Invoke("Timeout", 1000); // Set field value
EventListener
The monitoring of raised events is done by the EventListener class which hooks listenable events on a concrete object to runtime-created
subscriber delegates that notifies using instances of IEventNotifier.
This is done as follows:
using EventListener eventListener = EventListener.Bind<IMyService>(myService, eventNotifier1, eventNotifier2);
eventListener.StartListening();
eventNotifier1 and eventNotifier2 are cutom implementations of IEventNotifier.
They will notify the event name and any associated event arguments when an event is raised on the concrete class myService.
public class EventNotifier : IEventNotifier
{
public void NotifyEvent(string eventName, object?[] arguments)
{
// Triggered when an event is raised
}
}
...
EventNotifier eventNotifier = new();
By default, new instance of EventListener does not listen for raised events. The EventListener.StartListening method must be called to do so.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. 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. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net6.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.