Refactored SettingsLocker to use an extension method for cleaner property expression handling

This commit is contained in:
Thorsten Sommer 2025-07-31 15:51:19 +02:00
parent e8e79a635f
commit 695cc4cbbb
Signed by: tsommer
GPG Key ID: 371BBA77A02C0108
2 changed files with 30 additions and 23 deletions

View File

@ -0,0 +1,26 @@
using System.Linq.Expressions;
namespace AIStudio.Settings;
public static class ExpressionExtensions
{
private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(typeof(ExpressionExtensions));
public static MemberExpression GetMemberExpression<T>(this Expression<Func<T, object>> expression)
{
switch (expression.Body)
{
// Case for value types, which are wrapped in UnaryExpression:
case UnaryExpression { NodeType: ExpressionType.Convert } unaryExpression:
return (MemberExpression)unaryExpression.Operand;
// Case for reference types, which are directly MemberExpressions:
case MemberExpression memberExpression:
return memberExpression;
default:
LOGGER.LogError($"Expression '{expression}' is not a valid property expression.");
throw new ArgumentException($"Expression '{expression}' is not a valid property expression.", nameof(expression));
}
}
}

View File

@ -4,12 +4,11 @@ namespace AIStudio.Settings;
public sealed class SettingsLocker
{
private static readonly ILogger<SettingsLocker> LOGGER = Program.LOGGER_FACTORY.CreateLogger<SettingsLocker>();
private readonly Dictionary<string, Dictionary<string, Guid>> lockedProperties = new();
public void Register<T>(Expression<Func<T, object>> propertyExpression, Guid configurationPluginId)
{
var memberExpression = GetMemberExpression(propertyExpression);
var memberExpression = propertyExpression.GetMemberExpression();
var className = typeof(T).Name;
var propertyName = memberExpression.Member.Name;
@ -21,7 +20,7 @@ public sealed class SettingsLocker
public void Remove<T>(Expression<Func<T, object>> propertyExpression)
{
var memberExpression = GetMemberExpression(propertyExpression);
var memberExpression = propertyExpression.GetMemberExpression();
var className = typeof(T).Name;
var propertyName = memberExpression.Member.Name;
@ -38,7 +37,7 @@ public sealed class SettingsLocker
public Guid GetConfigurationPluginId<T>(Expression<Func<T, object>> propertyExpression)
{
var memberExpression = GetMemberExpression(propertyExpression);
var memberExpression = propertyExpression.GetMemberExpression();
var className = typeof(T).Name;
var propertyName = memberExpression.Member.Name;
@ -51,28 +50,10 @@ public sealed class SettingsLocker
public bool IsLocked<T>(Expression<Func<T, object>> propertyExpression)
{
var memberExpression = GetMemberExpression(propertyExpression);
var memberExpression = propertyExpression.GetMemberExpression();
var className = typeof(T).Name;
var propertyName = memberExpression.Member.Name;
return this.lockedProperties.TryGetValue(className, out var props) && props.ContainsKey(propertyName);
}
private static MemberExpression GetMemberExpression<T>(Expression<Func<T, object>> expression)
{
switch (expression.Body)
{
// Case for value types, which are wrapped in UnaryExpression:
case UnaryExpression { NodeType: ExpressionType.Convert } unaryExpression:
return (MemberExpression)unaryExpression.Operand;
// Case for reference types, which are directly MemberExpressions:
case MemberExpression memberExpression:
return memberExpression;
default:
LOGGER.LogError($"Expression '{expression}' is not a valid property expression.");
throw new ArgumentException($"Expression '{expression}' is not a valid property expression.", nameof(expression));
}
}
}