我一直在试图找到一种方法来处理属性映射和以编程方式命名。问题是我不想更改代码的多个部分以便能够扩展地图。我现在的代码是这样的:
public static class Names
{
public const string Property = "propertyNameToBeUsedInJson";
}
...
switch(propertyName)
{
case Property:
user.propertyToBeMapped = json.propertyValue;
break;
}
我真正想要的是能够拥有某种字典,我可以做以下事情:
Dictionary<string, Action>() { {"propertyNameToBeUsedInJson", <Class of User>.propertyToBeMapped} };
这意味着我将委托访问Class的属性,而不是具体对象。这样我可以遍历这个字典,如果它包含我正在寻找的密钥,那么我就去改变值所指向的属性。
我认为初始化期间的开销是可以的,但我不想在每次调用的基础上使用Reflection。
问题是:是否可以使用第二种方式考虑上述陈述?如果是这样,我应该怎么做呢?
答案 0 :(得分:0)
总结一下评论:
绝对可以使用字典来完成,但不能以这种方式使用属性。请记住,属性只是语法糖,因此您不必自己编写get / set方法。将它放入字典的最佳方法可能是将其包装到委托中:
new Dictionary<string, Func<YourClass, string>>()
{
{"propertyNameToBeUsedInJson",
instance => instance.YourProperty}
};
然后,你会非常容易地使用它(忽略错误检查):
user.propertyToBeMapped = dictionary[propertyName](yourClassInstance);
这仅在实例始终为同一个类时才有效。如果没有,Func
的第一个参数必须是某个基类(甚至可能是object
),然后委托必须进行一些类型检查和转换。