使用自定义属性覆盖Getter/Setter

本文关键字:Setter Getter 覆盖 自定义属性 | 更新日期: 2023-09-27 18:27:53

我们有一个自定义ConfigurationManager库,可以将config.json文件序列化/反序列化为ExpandoObject。

是否可以创建一个覆盖这些属性的Getter/Setter的自定义属性来抽象此ExpandoObject?

理想情况下,我可以使用这样的属性:

[System.AttributeUsage(System.AttributeTargets.Property)]
class Configureable : System.Attribute
{
    public string Default { get; set; }
    public bool IsEncrypted { get; set; }
}

class Test
{
    [Configureable(Default = "0",IsEncrypted = false)]
    public string MyValue { get; set; }
}

当我设置装饰属性的值时,我想自动神奇地更新ExpandoObject的值,这将反过来迫使更新写入我的config.json文件。

当我访问装饰属性的值时,我希望getter实际返回底层ExpandoObject的值。我可以通过手动让开发人员修改getter/setter来实现这一点。我想知道我是否也可以用属性中的代码来实现这一点。

谢谢!

使用自定义属性覆盖Getter/Setter

我找到了http://doc.postsharp.net/location-interception

这似乎正是我想要的。

[System.AttributeUsage(System.AttributeTargets.Property)]
    [Serializable]
    class Configureable : LocationInterceptionAspect 
    {
        public string Default { get; set; }
        public bool IsEncrypted { get; set; }
        public override void OnGetValue(LocationInterceptionArgs args)
        {
            base.OnGetValue(args);
            if (args.Value == null)
            {
            }
        }
        public override void OnSetValue(LocationInterceptionArgs args)
        {
            //base.OnSetValue(args);
        }
    }

    class Test
    {
        [Configureable(Default = "0",IsEncrypted = false)]
        public string MyValue { get; set; }
    }

ExpandoObject是一个具有对象语法的字典。它只在简单的场景中有用。如果您需要复杂的逻辑,请使用DynamicObject集成。重写其TryGetMemberTrySetMember方法以复制ExpandoObject的功能,然后按照您想要的方式自定义这些方法的逻辑。

目前还不清楚你的要求是什么。如果你有一个包含属性的类,那么拥有动态对象有什么意义?