如何通过.NET中的字符串名称参数设置属性访问

时间:2016-12-08 19:00:45

标签: .net reflection properties

如何编写扩展方法" SetPropValue"它的工作方式如下:

myObject.SetPropValue("Address") = "blahblah"

// which does:
myObject.Address = "blahblah"

还有" GetPropValue":

Object address = myObject.GetPropValue("Address")

1 个答案:

答案 0 :(得分:2)

C#不提供实现第一种语法的工具,因为赋值运算符不允许重载。但是,您可以为setter使用更传统的语法:

myObject.SetPropValue("Address", "blahblah");

以下是如何做到这一点:

public static void SetPropVal<T>(this object obj, string name, T val) {
    if (obj == null) return;
    obj.GetType().GetProperty(name)?.SetValue(obj, val);
}

public static T GetPropVal<T>(this object obj, string name) {
    if (obj == null) return default(T);
    var res = obj.GetType().GetProperty(name)?.GetValue(obj);
    return res != null ? (T)res : default(T);
}

请注意,只有在编译时知道字符串时,此方法才有意义,即它们来自用户或来自配置。在编译时知道字符串时,转换为dynamic可以使用更易读的语法实现相同的功能。