繁体   English   中英

使用 C# 反射,如果该对象是列表内的对象的属性,则如何获取该对象的属性及其值

[英]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; }
}

我需要做的是让每个TicketReportPropertyEntityTicketReportPropertyEntity获取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();

然后,您将拥有AmoutPropertyName属性之间的关系。

为此,您还必须获得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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM