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

时间:2018-09-04 09:13:54

标签: c#

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

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 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中的属性数量可以随时变化。所以我不能只依靠现有的领域。我需要从所有领域中获取价值

3 个答案:

答案 0 :(得分: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>();
    

答案 1 :(得分: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));
                }
            }

答案 2 :(得分: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 );

P.S。您可以考虑将这些字段作为数组或List<Field>公开。编号属性是一种代码气味。

相关问题