From 1a0d750f0204a2ab5c98c5ed1bce2d91b417fccc Mon Sep 17 00:00:00 2001 From: TheXamlGuy Date: Sun, 2 Jun 2024 18:48:51 +0100 Subject: [PATCH] Allow subscription keys to be resolved by reflection --- Toolkit.Foundation/Mediator.cs | 2 +- Toolkit.Foundation/ObjectExtensions.cs | 5 ++--- Toolkit.Foundation/Observable.cs | 23 +++++++++++++++-------- Toolkit.Foundation/Subscription.cs | 9 ++++++++- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/Toolkit.Foundation/Mediator.cs b/Toolkit.Foundation/Mediator.cs index c47a009..f5c77fd 100644 --- a/Toolkit.Foundation/Mediator.cs +++ b/Toolkit.Foundation/Mediator.cs @@ -32,7 +32,7 @@ public class Mediator(IHandlerProvider handlerProvider, } } - foreach (object? handler in handlerProvider.Get(messageType)) + foreach (object? handler in handlerProvider.Get(messageType, key)) { if (handler is not null) { diff --git a/Toolkit.Foundation/ObjectExtensions.cs b/Toolkit.Foundation/ObjectExtensions.cs index 0d00c3f..d2109be 100644 --- a/Toolkit.Foundation/ObjectExtensions.cs +++ b/Toolkit.Foundation/ObjectExtensions.cs @@ -8,9 +8,8 @@ public static class ObjectExtensions { Type type = obj.GetType(); - object? key = selector(); - if (type.GetProperty($"{key}") is PropertyInfo property - && property.GetValue(obj) is { } value) + object? key = selector(); + if (type.GetProperty($"{key}") is PropertyInfo property && property.GetValue(obj) is { } value) { return value; } diff --git a/Toolkit.Foundation/Observable.cs b/Toolkit.Foundation/Observable.cs index b0d48b9..eb0055a 100644 --- a/Toolkit.Foundation/Observable.cs +++ b/Toolkit.Foundation/Observable.cs @@ -120,17 +120,24 @@ public partial class Observable(IServiceProvider provider, private TValue? value = value; } -public partial class Observable(IServiceProvider provider, - IServiceFactory factory, - IMediator mediator, - IPublisher publisher, - ISubscription subscriber, - IDisposer disposer, - TValue? value = default) : Observable(provider, factory, mediator, publisher, subscriber, disposer) +public partial class Observable : Observable { [ObservableProperty] private TKey? key; [ObservableProperty] - private TValue? value = value; + private TValue? value; + + public Observable(IServiceProvider provider, + IServiceFactory factory, + IMediator mediator, + IPublisher publisher, + ISubscription subscriber, + IDisposer disposer, + TKey? key = default, + TValue? value = default) : base(provider, factory, mediator, publisher, subscriber, disposer) + { + Key = key; + Value = value; + } } \ No newline at end of file diff --git a/Toolkit.Foundation/Subscription.cs b/Toolkit.Foundation/Subscription.cs index 10878f3..f974bc2 100644 --- a/Toolkit.Foundation/Subscription.cs +++ b/Toolkit.Foundation/Subscription.cs @@ -120,7 +120,14 @@ public class Subscription(SubscriptionCollection subscriptions, keys[attribute.Type] = value; } - value.Add(attribute.Key); + if (subscriber.GetPropertyValue(() => attribute.Key) is object key) + { + value.Add(key); + } + else + { + value.Add(attribute.Key); + } } return keys;