【问题标题】:Override Getter/Setter with Custom Attribute使用自定义属性覆盖 Getter/Setter
【发布时间】:2014-10-24 23:58:59
【问题描述】:

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

谢谢!

【问题讨论】:

  • “抽象这个 ExpandoObject”是什么意思?您能否详细说明一下,一旦物业被装修,您会发生什么?
  • 类型和属性不知道装饰它们的属性。属性被编译到程序集中,您必须使用反射来访问它们。 (反之亦然:属性不知道它们装饰的是什么类型或道具)。因此,属性本身覆盖任何东西的可能性不大。
  • @YuvalItzchakov - 我已经澄清了我的要求。

标签: c#


【解决方案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; }
    }

【讨论】:

  • 它被称为PostSharp,它会让你付出代价。考虑查看标题下的 OSS Aspect Oriented Programming
  • @YuvalItzchakov - “我可以将 PostSharp Express 用于商业产品吗?可以。您可以使用 PostSharp Express 构建商业产品并重新分发它们。但是,Express Edition 只包含一个有限的子”
  • 是的,当然你有一个特快版,这是有限的。有很多类似的 OSS
【解决方案2】:

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

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

【讨论】:

  • 我不确定这是否真的回答了 OP 的问题。我假设他知道ExpandoObject 是什么。
猜你喜欢
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 2014-04-08
  • 2021-11-06
  • 1970-01-01
  • 2011-03-21
相关资源
最近更新 更多