反思:如何通过PropertyInfo获取类对象

Posted

技术标签:

【中文标题】反思:如何通过PropertyInfo获取类对象【英文标题】:Reflection: How to get the class object via PropertyInfo 【发布时间】:2020-05-01 22:05:16 【问题描述】:

我有 2 节课。 ClassA 有一些 ClassB 的对象,称为 Field01, Field02, ... A 类也有 B 类项目的列表。

我知道 ClassB 项目的名称,并想用列表中的值填充 ClassB 项目。

示例代码:

public class ClassA

    public ClassB Field01 get;set;
    public ClassB Field02 get;set;
    //...

    List<ClassB> myItems;

    public void FillItems()
    
        foreach(var item in MyItems)
        
           // what I want in hardcode:
           Field01.ValueA = MyItems[0].ValueA;
           Field01.ValueB = MyItems[0].ValueB;
           Field02.ValueA = MyItems[1].ValueA;
           // ...
        
    


public class ClassB 

    public string ValueA get;set;
    public string ValueB get;set;

在我的情况下,我将有一个计数变量,它将创建 Field01、Field02、Field03、...名称,具体取决于我的列表中有多少项目(ClassA 中总是有足够的 ClassB 字段可以填充)

我知道我可以通过名称获取我的 ClassB 项目的 PropertyInfo,但是我不知道我可以访问 ClassB 属性 ValueA 和 ValueB

// If ClassB was just a string or object this would work
Type myType = typeof(ClassA);
PropertyInfo myPropInfo = myType.GetProperty("Field01");
myPropInfo.SetValue(this, "Hello", null);

【问题讨论】:

您是否在示例代码中编写了额外的 foreach 循环? “额外”是什么意思 ***.com/questions/34628996/… @K.Dexter 示例代码中的 foreach 循环似乎是多余的,不是吗?您肯定不想多次使用相同的值设置每个字段吗?反正你没有使用item @Sweeper 啊我现在是什么意思...硬代码属于 foreach 之上...在 foreach 循环中,生成字段名并且每个项目都针对一个字段 :) 我正在测试您的马上回答 【参考方案1】:

既然你知道属性的声明类型是ClassB,你可以得到ValueAValueBPropertyInfo。然后,您需要获取 FieldXX 的值(不要设置它!)和设置 ValueAValueB

我们将处理多个TypePropertyInfoobject 对象,因此您应该正确命名变量,而不仅仅是myPropInfomyType

for (int i = 0 ; i < MyItems.Count ; i++) 
    var classAType = typeof(ClassA);
    var classBType = typeof(ClassB);
    var fieldInfo = classAType.GetProperty("Field" + $"i".PadLeft(2, '0'));
    var fieldValue = fieldInfo.GetValue(this);
    var valueAInfo = classBType.GetProperty(nameof(ClassB.ValueA));
    var valueBInfo = classBType.GetProperty(nameof(ClassB.ValueB));
    valueAInfo.SetValue(fieldValue, valueAInfo.GetValue(MyItems[i]));
    valueBInfo.SetValue(fieldValue, valueBInfo.GetValue(MyItems[i]));

【讨论】:

好的,到目前为止这个工作:) 但前提是我在 ClassA 中实例化我的 ClassB 对象public ClassB Field01 get;set; = new ClassB(); @K.Dexter 当然你需要实例化它们!否则你会得到一个NRE。 有没有办法在循环中实例化它们? @K.Dexter 不是var fieldValue = fieldInfo.GetValue(this);,而是var fieldValue = new ClassB();fieldInfo.SetValue(this, fieldValue);

以上是关于反思:如何通过PropertyInfo获取类对象的主要内容,如果未能解决你的问题,请参考以下文章

c# 如何通过反射 获取属性值

获取 PropertyInfo 的递归例程

C#遍历类的属性 PropertyInfo.Attributes

我可以在不使用反射的情况下获取类中字段或属性的 PropertyInfo 吗?

如何从对象获取值,但其类型无法访问

通过反射,获取类的属性