我们有一个自定义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来做到这一点。我想知道我是否也可以使用属性中的代码来执行此操作。
谢谢!
答案 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。覆盖其TryGetMember
和TrySetMember
方法以复制ExpandoObject
的功能,然后以您希望的方式自定义这些方法的逻辑。
但不清楚您的要求是什么。如果你有一个包含属性的类,那么拥有动态对象有什么意义呢?