反射:如何通过PropertyInfo获得类对象

问题描述 投票:0回答:2

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

我知道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);
c# reflection attributes classname propertyinfo
2个回答
1
投票

由于您知道属性的声明类型为ClassB,因此可以获得PropertyInfoValueAValueB。然后,您需要获取 FieldXX的值(不进行设置!)和set 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]));
}

0
投票

使用getValue函数:

PropertyInfo myPropInfo = myType.GetProperty("Field01");
var obj = myPropInfo.GetValue(ClassAObj, null) as ClassB;

然后您可以从obj访问值。

ClassAObj是要从中获取属性的对象。

© www.soinside.com 2019 - 2024. All rights reserved.