委托访问 class 属性 而不是对象 属性
Delegating access to a class property instead of an object property
我一直在尝试找到一种方法来以编程方式处理 属性 映射和命名。问题是我不想为了扩展地图而必须更改多个代码部分。我现在的代码是这样的:
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 的 属性 的访问权限,而不是对具体对象的访问权限。这样我就可以遍历这个字典,如果它包含我正在寻找的键,那么我就去更改值指向的 属性。
我认为初始化期间的开销是可以的,但我不想在每次调用的基础上使用反射。
问题是:考虑到上述陈述,是否可以使用第二种方式?如果是这样,我应该怎么做?
只是总结评论:
当然可以用字典来做,但是不能这样使用属性。请记住,属性只是语法糖,因此您不必自己编写 get/set 方法。将其放入字典的最佳方法可能是将其包装到委托中:
new Dictionary<string, Func<YourClass, string>>()
{
{"propertyNameToBeUsedInJson",
instance => instance.YourProperty}
};
然后,你就可以像这样使用它(省略错误检查):
user.propertyToBeMapped = dictionary[propertyName](yourClassInstance);
这仅在实例始终相同时才有效class。如果不是,Func
的第一个参数必须是一些基础 class(甚至可能是 object
),然后委托必须进行一些类型检查和转换。
我一直在尝试找到一种方法来以编程方式处理 属性 映射和命名。问题是我不想为了扩展地图而必须更改多个代码部分。我现在的代码是这样的:
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 的 属性 的访问权限,而不是对具体对象的访问权限。这样我就可以遍历这个字典,如果它包含我正在寻找的键,那么我就去更改值指向的 属性。
我认为初始化期间的开销是可以的,但我不想在每次调用的基础上使用反射。
问题是:考虑到上述陈述,是否可以使用第二种方式?如果是这样,我应该怎么做?
只是总结评论:
当然可以用字典来做,但是不能这样使用属性。请记住,属性只是语法糖,因此您不必自己编写 get/set 方法。将其放入字典的最佳方法可能是将其包装到委托中:
new Dictionary<string, Func<YourClass, string>>()
{
{"propertyNameToBeUsedInJson",
instance => instance.YourProperty}
};
然后,你就可以像这样使用它(省略错误检查):
user.propertyToBeMapped = dictionary[propertyName](yourClassInstance);
这仅在实例始终相同时才有效class。如果不是,Func
的第一个参数必须是一些基础 class(甚至可能是 object
),然后委托必须进行一些类型检查和转换。