委托访问 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),然后委托必须进行一些类型检查和转换。