从类中的每个属性获取特定字段

问题描述 投票:0回答:3

我有一个具有多个属性的类。每个属性都有另一个类。

public class FirstClass
{
    public Field Field1 { get; set; }
    public Field Field2 { get; set; }
    public Field Field3 { get; set; }
    public Field Field4 { get; set; }
    public Field Field5 { get; set; }
}

Field类看起来像这样

public class Field
{
    public string Label { get; set; }
    public string ExternalId { get; set; }
    public int FieldId { get; set; }
    public string Type { get; set; }
}

有没有办法从FirstClass中的每个属性获取所有FieldId?

我想要的是这样的。

var fieldIds = // go through each fields (Field1 to FieldN) and select FieldId from each property.

FirstClass中的属性数量可以不时变化。所以我不能只依靠现有的领域来做。我需要从所有领域获得价值

c#
3个回答
5
投票

您有两种选择:

  1. “编译时间” public class FirstClass { public Field Field1 { get; set; } public Field Field2 { get; set; } public Field Field3 { get; set; } public Field Field4 { get; set; } public Field Field5 { get; set; } public IEnumerable<Field> AllFields => new [] { Field1, Field2, Field3, Field4, Field5 }; }
  2. “运行时间”(使用反射) var firstClassInstance = new FirstClass(); var allFields = firstClassInstance.GetType().GetProperties() .Select(p => p.GetValue(firstClassInstance)) .OfType<Field>();

3
投票

如果你想得到FieldId的每个值,试试这个:

var FieldIds = new List<object>();
            var foo = new FirstClass();
            foo.Field1 = new Field() { FieldId = 1 };
            foo.Field2 = new Field() { FieldId = 2 };
            foo.Field3 = new Field() { FieldId = 3 };
            foo.Field4 = new Field() { FieldId = 4 };
            foo.Field5 = new Field() { FieldId = 5 };


            foreach (var prop in foo.GetType().GetProperties())
            {
                if(prop.PropertyType == typeof(Field))
                {
                    var field = prop.GetValue(foo, null) as Field;

                    FieldIds.Add(field.GetType().GetProperty("FieldId").GetValue(field,null));
                }
            }

1
投票

把它们放在一个数组中。

var o = new FirstClass();
var fields = new Field[] { o.Field1, o.Field2, o.Field3, o.Field4, o.Field5 };

然后选择数组。

var fieldIds = fields.Select( f => f.FieldId );

附:您可以考虑将这些字段公开为数组或List<Field>。编号属性是代码气味。

© www.soinside.com 2019 - 2024. All rights reserved.