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

时间:2014-10-24 13:55:23

标签: c#

我们有一个自定义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来做到这一点。我想知道我是否也可以使用属性中的代码来执行此操作。

谢谢!

2 个答案:

答案 0 :(得分:1)

我找到了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; }
    }

答案 1 :(得分:0)

ExpandoObject是一个包含对象语法的字典。它仅在简单场景中有用。如果您需要复杂的逻辑,请使用DynamicObject intead。覆盖其TryGetMemberTrySetMember方法以复制ExpandoObject的功能,然后以您希望的方式自定义这些方法的逻辑。

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