使用自定义属性覆盖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来实现这一点。我想知道我是否也可以用属性中的代码来实现这一点。
谢谢!
我找到了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
集成。重写其TryGetMember
和TrySetMember
方法以复制ExpandoObject
的功能,然后按照您想要的方式自定义这些方法的逻辑。
目前还不清楚你的要求是什么。如果你有一个包含属性的类,那么拥有动态对象有什么意义?