![](/img/trans.png)
[英]C# - How to get/set an object's property value without using Reflection
[英]Using C# Reflection, how to get Object's properties and their values if that Object is a property of Object that is inside of the List
我需要获取 ObjectB 的属性值,它是 ObjectA 的属性,而 ObjectA 位于List<ObjectA>
我浏览了一些示例,但找不到我需要的确切内容。
这是我要找的:
我有一个类MyScreenClass
,它有一个List<TicketReportPropertyEntity>
:
public class MyScreenClass
{
public List<TicketReportPropertyEntity> TicketReportPropertyEntities{ get; set; }
}
这是TicketReportPropertyEntity
类,它有另一个类,我需要使用该类:
public class TicketReportPropertyEntity
{
public decimal Amount{get;set;}
public ReportPropertyEntity ReportProperty {get;set;}
}
这是ReportPropertyEntity
类:
public class ReportPropertyEntity
{
public string PropertyName { get; set; }
}
我需要做的是让每个TicketReportPropertyEntity
从TicketReportPropertyEntity
获取Amount
,从ReportPropertyEntity
获取PropertyName
。
目的是我需要将PropertyName
与给定的属性进行比较并将值设置为Amount
到目前为止,我只想出了以下几点:
foreach (var ticketReportEntity in mol.TicketReportPropertyEntities)
{
PropertyInfo propertyInfo1 = ticketReportEntity.GetType().GetProperty("ReportProperty");
//here I need to do all the logic
}
解决办法是什么?
如果您必须使用这两个属性,并且必须存储它才能使用它,则可以使用:
List<TicketReportPropertyEntity> list = mol.TicketReportPropertyEntities;
List<keyValuePair<string, decimal>> values =
list.ToDictionary(element => element.ReportProperty.PropertyName, element => element.Amout).ToList();
然后,您将拥有Amout
和PropertyName
属性之间的关系。
为此,您还必须获得ReportPropertyEntity.PropertyName
的子PropertyInfo
。 然后,继续根据您的目标检查它并设置为您需要的数量。
MyScreenClass mol = new MyScreenClass{ TicketReportPropertyEntities = new List<TicketReportPropertyEntity>()};
mol.TicketReportPropertyEntities.Add(new TicketReportPropertyEntity
{
ReportProperty = new ReportPropertyEntity
{
PropertyName = "CoolPropertyName"
}
});
string propertyToSearchFor = "CoolPropertyName";
foreach (var ticketReportEntity in mol.TicketReportPropertyEntities)
{
var type = ticketReportEntity.GetType();
//Get PropertyInfo objects
PropertyInfo reportProperty = type.GetProperty("ReportProperty");
PropertyInfo reportPropertyName = typeof(ReportPropertyEntity).GetProperty("PropertyName");
PropertyInfo amountProperty = type.GetProperty("Amount");
//Get needed values
ReportPropertyEntity reportPropertyValue = (ReportPropertyEntity)reportProperty.GetValue(ticketReportEntity);
string reportPropertyNameValue = (string)reportPropertyName.GetValue(reportPropertyValue);
//Check if change is required
if (reportPropertyNameValue == propertyToSearchFor)
{
amountProperty.SetValue(ticketReportEntity, 123.45M);
}
}
// get PropertyName from ReportPropertyEntity, and find it on TicketReportPropertyEntity
var myScreen = new MyScreenClass()
{
TicketReportPropertyEntities = new List<UserQuery.TicketReportPropertyEntity>
{
new TicketReportPropertyEntity{
Amount=1.0m,
ReportProperty = new ReportPropertyEntity{PropertyName="Name"}
}
}
};
var reportPropertyAccessor = typeof(TicketReportPropertyEntity).GetProperty(nameof(TicketReportPropertyEntity.ReportProperty));
var propertyNameAccessor = typeof(ReportPropertyEntity).GetProperty(nameof(ReportPropertyEntity.PropertyName));
var amountAccessor = typeof(TicketReportPropertyEntity).GetProperty(nameof(TicketReportPropertyEntity.Amount));
typeof(TicketReportPropertyEntity).GetProperties().Dump();
foreach(object ticketReportEntity in myScreen.TicketReportPropertyEntities){
var ticketReportPropertyEntity=reportPropertyAccessor.GetValue(ticketReportEntity);
var pn = propertyNameAccessor.GetValue(ticketReportPropertyEntity);
if("Name" == (string)pn){
ticketReportPropertyEntity.Dump();
amountAccessor.SetValue(ticketReportEntity,2.0m);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.