遍历C#对象的字段

时间:2018-12-06 14:21:38

标签: c#

在一个项目中,有一个报告类,如下所示:

public class ReportRowDataContract
{   
    public ReportDataDataContract ReportData1 { get; set; }

    public ReportDataDataContract ReportData2 { get; set; }

    public ReportDataDataContract ReportData3 { get; set; }

    public ReportDataDataContract ReportData4 { get; set; }

    public ReportDataDataContract ReportData5 { get; set; }

    public ReportDataDataContract ReportData6 { get; set; }        
}

然后有一种方法可以处理上述类中的对象。这是此方法的第一部分:

public ReportGrid(List<ReportRowDataContract> items , List<ReportDataDataContract> summaryData)
            : base(items)
        {

                passedInSummaryData = summaryData;

                if (items[0].ReportData1 != null)
                {
                    if (items[0].ReportData1.DecimalValue != null)
                    {

                        Columns.Add(m => m.ReportData1.DecimalValue).Titled(items[0].ReportData1.Name).Encoded(false).
                            Sanitized(false).RenderValueAs(
                                m => (string.IsNullOrEmpty(@m.ReportData1.DisplayFormat)) ? Convert.ToDecimal(@m.ReportData1.DecimalValue).ToString("N") : Convert.ToDecimal(@m.ReportData1.DecimalValue).ToString(@m.ReportData1.DisplayFormat));

                        if (items[0].ReportData1.SumValue || items[0].ReportData1.AvgValue)
                        {
                            displaySummary = true;
                            SummaryData.Add(
                                new ReportDataDataContract
                                    {
                                        Name = items[0].ReportData1.Name,
                                        AvgValue = items[0].ReportData1.AvgValue,
                                        DecimalValue = 0
                                    });
                        }
                    }
                    else if (items[0].ReportData1.IntValue != null)
                    {
                        Columns.Add(m => m.ReportData1.IntValue).Titled(items[0].ReportData1.Name);
                        if (items[0].ReportData1.SumValue || items[0].ReportData1.AvgValue)
                        {
                            displaySummary = true;
                            SummaryData.Add(
                                new ReportDataDataContract
                                    {
                                        Name = items[0].ReportData1.Name,
                                        AvgValue = items[0].ReportData1.AvgValue,
                                        IntValue = 0
                                    });
                        }
                    }
                    else
                    {
                        Columns.Add(m => m.ReportData1.StringValue).Titled(items[0].ReportData1.Name);
                    }
                }
                if (items[0].ReportData2 != null)
                {
                    if (items[0].ReportData2.DecimalValue != null)
                    {
                    Columns.Add(m => m.ReportData2.DecimalValue).Titled(items[0].ReportData2.Name).Encoded(false).
                       Sanitized(false).RenderValueAs(
                           m => (string.IsNullOrEmpty(@m.ReportData2.DisplayFormat)) ? Convert.ToDecimal(@m.ReportData2.DecimalValue).ToString("N") : Convert.ToDecimal(@m.ReportData2.DecimalValue).ToString(@m.ReportData1.DisplayFormat));

                    if (items[0].ReportData2.SumValue || items[0].ReportData2.AvgValue)
                        {
                            displaySummary = true;
                            SummaryData.Add(
                                new ReportDataDataContract
                                    {
                                        Name = items[0].ReportData2.Name,
                                        AvgValue = items[0].ReportData2.AvgValue,
                                        DecimalValue = 0
                                    });
                        }
                    }
                    else if (items[0].ReportData2.IntValue != null)
                    {
                        Columns.Add(m => m.ReportData2.IntValue).Titled(items[0].ReportData2.Name);
                        if (items[0].ReportData2.SumValue || items[0].ReportData2.AvgValue)
                        {
                            displaySummary = true;
                            SummaryData.Add(
                                new ReportDataDataContract
                                    {
                                        Name = items[0].ReportData2.Name,
                                        AvgValue = items[0].ReportData2.AvgValue,
                                        IntValue = 0
                                    });
                        }
                    }
                    else
                    {
                        Columns.Add(m => m.ReportData2.StringValue).Titled(items[0].ReportData2.Name);
                    }

                }

此方法由重复执行到ReportData6的代码组成,每次重复仅更改ReportData字段名称。是否可以通过某种方式重写此方法以处理每个ReportData字段的方法?除了使方法更短之外,如果将来需要将附加ReportData字段添加到ReportRowDataContract类中,这对于避免手动更新方法也将非常有用。

编辑#1:我对C#还是陌生的,因此,详细的答案将非常有帮助。

编辑#2:由于以下Zohar Peled的帖子,以下代码感觉非常接近。但是,m.ReportData1在AddGridColumn()方法中引起了问题。错误消息是'ReportRowDataContract'不包含'item'的定义...
我尝试在调用AddGridColumn()时将ReportData 1作为第二个参数传递,但无济于事。有没有一种方法可以修改代码以使其起作用?

调用方法的代码:

    // create columns for grid
    AddGridColumn(items[0].ReportData1);
    AddGridColumn(items[0].ReportData2);
    AddGridColumn(items[0].ReportData3);
    AddGridColumn(items[0].ReportData4);
    AddGridColumn(items[0].ReportData5);
    AddGridColumn(items[0].ReportData6);

方法:

private void AddGridColumn(ReportDataDataContract item)
{
    if (item != null)
        {
            if (item.DecimalValue != null)
            {                        
                Columns.Add(m => m.ReportData1.DecimalValue).Titled(item.Name).Encoded(false).
                    Sanitized(false).RenderValueAs(
                        m => (string.IsNullOrEmpty(@m.ReportData1.DisplayFormat)) ?
                            Convert.ToDecimal(@m.ReportData1.DecimalValue).ToString("N") :
                            Convert.ToDecimal(@m.ReportData1.DecimalValue).ToString(@m.ReportData1.DisplayFormat));

                if (item.SumValue || item.AvgValue)
                {
                    displaySummary = true;
                    SummaryData.Add(
                        new ReportDataDataContract
                            {
                                Name = item.Name,
                                AvgValue = item.AvgValue,
                                DecimalValue = 0
                            });
                }
            }
            else if (item.IntValue != null)
            {
                Columns.Add(m => m.ReportData1.IntValue).Titled(item.Name);
                if (item.SumValue || item.AvgValue)
                {
                    displaySummary = true;
                    SummaryData.Add(
                        new ReportDataDataContract
                            {
                                Name = item.Name,
                                AvgValue = item.AvgValue,
                                IntValue = 0
                            });
                }
            }
            else
            {
                Columns.Add(m => m.ReportData1.StringValue).Titled(item.Name);
            }
        }
}

编辑#3:这是ReportDataDataContract类的定义:

public class ReportDataDataContract
{        
    public string Name { get; set; }        
    public string StringValue { get; set; }        
    public decimal? DecimalValue { get; set; }        
    public int? IntValue { get; set; }        
    public bool SumValue { get; set; }        
    public bool AvgValue { get; set; }        
    public int? Index { get; set; }    
    public string DisplayFormat { get; set; }    
}

2 个答案:

答案 0 :(得分:0)

可以将这样的索引属性添加到R​​eportRowDataContract以便从本质上访问ReportData值作为索引属性吗?

public ReportDataDataContract this[int i]
{
   get
   {
      return new ReportDataDataContract[] { ReportData1, ReportData2, ReportData3, ReportData4, ReportData5, ReportData6 }[i];
   }
}

例如,您可以使用items[0][i].SumValue代替items[0].ReportData1.SumValue

答案 1 :(得分:-1)

如果可以的话,您只需将ReportRowDataContract更改为仅包含ReportDataDataContract数组的单个属性。然后,您可以为每个数据协定使用一个简单的循环。

如果您无法更改ReportRowDataContract表,则可以使用一种方法,该方法接受一个ReportDataDataContract类型的参数,并在其中保存所有重复的代码-并对其每次调用一次属性。

该方法应如下所示(基于您发布的代码):

void DoSomething(ReportDataDataContract dataContranct)
{
    if (dataContranct != null)
    {
        if (dataContranct.DecimalValue != null)
        {

            Columns.Add(m => dataContranct.DecimalValue).Titled(dataContranct.Name).Encoded(false).
                Sanitized(false).RenderValueAs(
                    m => (string.IsNullOrEmpty(@dataContranct.DisplayFormat)) ? 
                        Convert.ToDecimal(@dataContranct.DecimalValue).ToString("N") : 
                        Convert.ToDecimal(@dataContranct.DecimalValue).ToString(@dataContranct.DisplayFormat));

            if (dataContranct.SumValue || dataContranct.AvgValue)
            {
                displaySummary = true;
                SummaryData.Add(
                    new ReportDataDataContract
                        {
                            Name = dataContranct.Name,
                            AvgValue = dataContranct.AvgValue,
                            DecimalValue = 0
                        });
            }
        }
        else if (dataContranct.IntValue != null)
        {
            Columns.Add(m => dataContranct.IntValue).Titled(dataContranct.Name);
            if (dataContranct.SumValue || dataContranct.AvgValue)
            {
                displaySummary = true;
                SummaryData.Add(
                    new ReportDataDataContract
                        {
                            Name = dataContranct.Name,
                            AvgValue = dataContranct.AvgValue,
                            IntValue = 0
                        });
            }
        }
        else
        {
            Columns.Add(m => mdataContranct.StringValue).Titled(dataContranct.Name);
        }
    }
}