c# - 通过变量引用属性名称

标签 c# reflection system.reflection

有没有办法用变量引用属性名?

场景:对象 A 具有公共(public)整数属性 X 和 Z,所以...

public void setProperty(int index, int value)
{
    string property = "";

    if (index == 1)
    {
        // set the property X with 'value'
        property = "X";
    }
    else 
    {
        // set the property Z with 'value'
        property = "Z";
    }

    A.{property} = value;
}

这是一个愚蠢的例子,所以请相信,我可以用它。

最佳答案

简单:

a.GetType().GetProperty("X").SetValue(a, value);

请注意,如果 a 的类型没有名为“X”的属性,则 GetProperty("X") 返回 null

要在您提供的语法中设置属性,只需编写一个扩展方法:

public static class Extensions
{
    public static void SetProperty(this object obj, string propertyName, object value)
    {
        var propertyInfo = obj.GetType().GetProperty(propertyName);
        if (propertyInfo == null) return;
        propertyInfo.SetValue(obj, value);
    }
}

然后像这样使用它:

a.SetProperty(propertyName, value);

UPD

请注意,这种基于反射的方法相对较慢。为了获得更好的性能,请使用动态代码生成或表达式树。有很好的图书馆可以为您做这些复杂的事情。例如,FastMember .

关于c# - 通过变量引用属性名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13292078/

相关文章:

c# - 如何输出 XmlDocument 以便元素属性也缩进?

c# - 哪个按钮调用了这个表单?

c# - 反射 GetValue 空属性

c# - 读取类型和成员的自定义属性声明

c# - SignalR Hub - 对用户进行身份验证,但也允许匿名用户

c# - ReverseString,一个 C# 面试题

c# - C#中如何防止非法ICloneable<T>继承?

reflection - 调用镜像的全局功能

android - 获取包中基类的所有子类的实例

Java 反射 : How do I override or generate methods at runtime?