使用对象属性作为字典中的键

2023-12-20

我想使用对象属性作为字典的键。这可以做到吗?

这样做的最终目标是使用它,以便可以在对象可能处于的各种状态下查看属性是否被锁定。这些锁定的值不会持久存在,仅存在于模型的业务规则中。

查看字段是否被锁定的理想代码如下所示;

bool ageLocked = myObject.IsFieldLocked( x => x.Age);

bool nameLocked = myObject.IsFieldLocked(x => x.Name);

IsFieldLocked 是 myObject 类型的扩展方法。

我希望字典位于 myObject 中,并且可以根据对象的状态替换为不同的字典变体,例如,已下订单或等待订单将具有不同的字典定义。

希望我能够使用工厂来创建不同的字典变体;

Factory.CreateAwaitingOrderLockedFields()

Factory.CreateOrderPlacedLockedFields()

定义字典看起来像这样

new Dictionary< ***MissingMagic***, bool>()
{
  { x => x.Age , true},
  { x => x.Name, false}
}

目的是避免键成为字符串,强类型键更可取。


我将字典简单地定义为Dictionary<string, bool>.

扩展方法可能如下所示:

public static bool IsFieldLocked<TField>(this MyClass self, Expression<Func<MyClass, TField>> propertyExpression)
{
    // note: null checks etc omitted for brevity

    var lambda = (LambdaExpression)propertyExpression;
    MemberExpression memberExpression;
    if (lambda.Body is UnaryExpression)
    {
        var unaryExpression = (UnaryExpression)lambda.Body;
        memberExpression = (MemberExpression)unaryExpression.Operand;
    }
    else
    {
        memberExpression = (MemberExpression)lambda.Body;
    }

    string propertyName = memberExpression.Member.Name;

    return self.InternalLockedFieldsDictionary[propertyName];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用对象属性作为字典中的键 的相关文章

随机推荐