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

如何在.NET中通过字符串名称参数设置属性访问,.net,reflection,properties,.net,Reflection,Properties,如何编写扩展方法“SetPropValue”,其工作原理如下: myObject.SetPropValue("Address") = "blahblah" // which does: myObject.Address = "blahblah" 以及“GetPropValue”: C#不提供实现第一个语法的工具,因为赋值运算符不允许重载。不过,您可以对setter使用更传统的语法: myObject.SetPropValue("Address", "blahblah"); 以下是您如何做到

如何编写扩展方法“SetPropValue”,其工作原理如下:

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

// which does:
myObject.Address = "blahblah"
以及“GetPropValue”:

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);
}
public static void SetPropVal(此对象对象对象,字符串名称,T val){
if(obj==null)返回;
obj.GetType().GetProperty(名称)?.SetValue(obj,val);
}
公共静态T getProval(此对象对象对象,字符串名称){
if(obj==null)返回默认值(T);
var res=obj.GetType().GetProperty(名称)?.GetValue(obj);
返回res!=null?(T)res:默认值(T);
}
请注意,这种方法只有在编译时字符串未知时才有意义,即它们来自用户或配置。当字符串在编译时已知时,通过强制转换到
动态
可以用更可读的语法实现相同的功能。

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);
}
public static void SetPropVal(此对象对象对象,字符串名称,T val){
if(obj==null)返回;
obj.GetType().GetProperty(名称)?.SetValue(obj,val);
}
公共静态T getProval(此对象对象对象,字符串名称){
if(obj==null)返回默认值(T);
var res=obj.GetType().GetProperty(名称)?.GetValue(obj);
返回res!=null?(T)res:默认值(T);
}

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

Good point@LarsTech。我改为object在某些情况下这是有用的,例如,设想一个动态情况,在这个情况下,您只知道在运行时要访问哪个属性good point@LarsTech。我改为object这在某些场景中很有用,例如,设想一个动态场景,在该场景中,您只会在运行时知道要访问什么属性。谢谢。您描述的字符串来自配置的场景正是我所面对的情况。您描述的字符串来自配置的场景正是我所面临的