循环遍历类属性并获取不同的值

时间:2018-05-21 17:03:00

标签: c#

如何在不单独浏览每个类属性的情况下执行此操作?我有一个包含54个属性的类,我想通过它从CosmosDB中检索值,然后使用每个属性中的Distinct值在视图中创建一个dropdownfo。

我可以单独完成它们 - 这段代码工作正常。但要为所有属性做到这一点......必须有一种更简单的方法。

我必须使用bankCountryCodeCurrency等来完成此操作。类FieldMasterInfo的所有属性。

IEnumerable<string> fieldId = allItems.Select(m => m.FieldId).Distinct();
var fieldSL = new List<SelectListItem>();

foreach (var element in fieldId)
{
    // adding null check here until cosmos db with null tenant id's for tax are removed.
    if (element != null)
    {
        fieldSL.Add(new SelectListItem
                        {
                            Value = element.ToString(),
                            Text = element.ToString()
                        });
    }
}

fieldSL = fieldSL.OrderBy(x => x.Text).ToList();
ViewBag.fieldIdList = fieldSL;

更新

这完美无缺。它遍历一个类并获取每个属性的不同值并将其放入字典&gt;

        FieldMasterInfo fmi = new FieldMasterInfo();
        PropertyInfo[] properties = fmi.GetType().GetProperties();

        Dictionary<string, IEnumerable<object>> sl = new Dictionary<string, IEnumerable<object>>();

        foreach (PropertyInfo property in properties)
        {
            sl[property.Name] = allItems.Select(m => m.GetType().GetProperty(property.Name).GetValue(m, null)).Distinct();
        }

2 个答案:

答案 0 :(得分:1)

将字段作为文本传递到数组中,然后使用反射动态读取属性。

var fieldNames = new string[] {"bankCountryCode", "Currency" };

foreach(var fieldName in fieldNames)
{
    IEnumerable<string> fieldId = allItems.Select(m => 
    m.GetType().GetProperty(fieldName).GetValue(m, null)).Distinct();
    var fieldSL = new List<SelectListItem>();

    foreach (var element in fieldId)
    {
        // adding null check here until cosmos db with null tenant id's for tax are removed.
        if (element != null)
        {
            fieldSL.Add(new SelectListItem
                        {
                            Value = element.ToString(),
                            Text = element.ToString()
                        });
        }
    }

    fieldSL = fieldSL.OrderBy(x => x.Text).ToList();
    ViewBag.fieldIdList = fieldSL;
}

答案 1 :(得分:0)

我承认我没有清楚地理解你的问题。但这是你需要的吗? (我无法测试,我在这里写道。)

IEnumerable<string> fieldId = allItems.Select(m => m.FieldId).Distinct();
var fieldSL = fieldId.Where(f => !string.IsNullOrEmpty(f)).Select(x => new SelectListItem { Text = f, Value = f })).OrderBy(i => i.Text).ToList();
ViewBag.fieldIdList = fieldSL;

无论哪种方式,更好地澄清情况,以便其他人可以帮助您。如果您需要更小的代码或其他逻辑或业务解决方案......