反思:如何通过PropertyInfo获取class对象
Reflection: How to get the class object via PropertyInfo
我有 2 个类。 ClassA 有一些 ClassB 的对象叫做 Field01, Field02, ...
Class 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 等名称,具体取决于我的列表中有多少项目(总是有足够的 ClassB 字段在 ClassA 中填写)
我知道我可以通过名称获取我的 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);
因为你知道属性的声明类型是ClassB
,你可以得到ValueA
和ValueB
的PropertyInfo
。然后,需要获取FieldXX
的值(不是设置!)和设置ValueA
和ValueB
.
我们将处理多个 Type
、PropertyInfo
和 object
对象,因此您应该适当地命名您的变量,而不仅仅是 myPropInfo
或 myType
.
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]));
}
我有 2 个类。 ClassA 有一些 ClassB 的对象叫做 Field01, Field02, ... Class 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 等名称,具体取决于我的列表中有多少项目(总是有足够的 ClassB 字段在 ClassA 中填写)
我知道我可以通过名称获取我的 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);
因为你知道属性的声明类型是ClassB
,你可以得到ValueA
和ValueB
的PropertyInfo
。然后,需要获取FieldXX
的值(不是设置!)和设置ValueA
和ValueB
.
我们将处理多个 Type
、PropertyInfo
和 object
对象,因此您应该适当地命名您的变量,而不仅仅是 myPropInfo
或 myType
.
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]));
}