【问题标题】:How to list all Variables of Class如何列出类的所有变量
【发布时间】:2023-04-07 20:05:01
【问题描述】:

有没有办法在 C# 中列出类的所有变量(字段)。 如果是,那么有人可以给我一些示例,如何将它们保存在 List 中并使用 Anonymous Types (var) 获取它们。

【问题讨论】:

标签: c# reflection


【解决方案1】:

问题不完全是 - 但这里是如何从名为“inv”的对象中获取 Decimal 类型的所有属性的值:

var properties = inv.GetType().GetProperties();

foreach (var prop in properties)
{
    if (prop.ToString().ToLower().Contains("decimal"))
    {
        totalDecimal += (Decimal)prop.GetValue(inv, null);
    }
}

【讨论】:

    【解决方案2】:

    你的问题不是很清楚。听起来您想要类的给定实例的字段值:

    var fieldValues = foo.GetType()
                         .GetFields()
                         .Select(field => field.GetValue(foo))
                         .ToList();
    

    请注意,fieldValuesList<object>。在这里,foo 是您的类的现有实例。

    如果你想要public和非public字段,你需要通过改变绑定标志

    var bindingFlags = BindingFlags.Instance |
                       BindingFlags.NonPublic |
                       BindingFlags.Public;
    var fieldValues = foo.GetType()
                         .GetFields(bindingFlags)
                         .Select(field => field.GetValue(foo))
                         .ToList();
    

    如果你只想要名字:

    var fieldNames = typeof(Foo).GetFields()
                                .Select(field => field.Name)
                                .ToList();
    

    这里,Foo 是您班级的名称。

    【讨论】:

    • 我得到一个“表达式不能包含 lambda 表达式”的语法
    【解决方案3】:

    这将列出类中所有字段的名称(公共和非公共,静态和实例字段):

    BindingFlags bindingFlags = BindingFlags.Public |
                                BindingFlags.NonPublic |
                                BindingFlags.Instance |
                                BindingFlags.Static;
    
    foreach (FieldInfo field in typeof(TheClass).GetFields(bindingFlags))
    {
        Console.WriteLine(field.Name);
    }
    

    如果您想获取基于某个对象实例的字段,请改用GetType

    foreach (FieldInfo field in theObject.GetType().GetFields(bindingFlags))
    {
        Console.WriteLine(field.Name);
    }
    

    【讨论】:

    • 这对我有用。试图获取我班上的所有枚举:MyEnum enum = (MyEnum)0;
    【解决方案4】:
    myClass.GetType().GetProperties()
    

    【讨论】:

    • 他询问的是字段而不是属性。
    • 他问的是变量而不是字段。
    【解决方案5】:
    var fields = whateverYourClassType.GetType().GetFields().Select(f => f.Name).ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 2016-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      相关资源
      最近更新 更多