【问题标题】:How do I get a list of all the public variables I have in a Class? (C#)如何获取我在一个类中拥有的所有公共变量的列表? (C#)
【发布时间】:2011-05-16 18:48:12
【问题描述】:

我有一个包含很多公共变量的类,我需要能够获取它们的列表。

这是我的课的一个例子:

public class FeatList: MonoBehaviour {
public static Feat  Acrobatic = new Feat("Acrobatic", false, "");
public static Feat AgileManeuvers = new Feat("Agile Maneuvers", false, "" ); void Start(){}}

除了还有大约 100 个变量。有没有办法将所有这些成员变量放在一个可管理的数组中?还是我把自己搞砸了?

【问题讨论】:

    标签: c# arrays reflection public member


    【解决方案1】:

    如果您关注变量 NAMES - 那么这会将它们提供给您:

    IEnumerable<string> variableNames =
        typeof(FeatList).GetFields(BindingFlags.Instance | 
                BindingFlags.Static | BindingFlags.Public)
            .Select(f => f.Name);
    

    但如果您想要 VALUES,那么这将起作用:

    Dictionary<string,object> variableValues =
        typeof (FeatList).GetFields(BindingFlags.Instance | 
                BindingFlags.Static | BindingFlags.Public)
            .ToDictionary(f => f.Name, f => f.GetValue(myFeatList));
    

    【讨论】:

    • 如果可以的话,我会投票 3 次,它为我节省了很多时间!
    【解决方案2】:

    如果“变量”是指类字段(如类级别的变量),您可以使用 reflection 来获取访问权限,例如在此 MSDN Microsoft 示例中使用 FieldInfo class (see MSDN link for more info)

    using System;
    using System.Reflection;
    
    public class FieldInfoClass
    {
        public int myField1 = 0;
        protected string myField2 = null;
        public static void Main()
        {
            FieldInfo[] myFieldInfo;
            Type myType = typeof(FieldInfoClass);
            // Get the type and fields of FieldInfoClass.
            myFieldInfo = myType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance
                | BindingFlags.Public);
            Console.WriteLine("\nThe fields of " + 
                "FieldInfoClass are \n");
            // Display the field information of FieldInfoClass.
            for(int i = 0; i < myFieldInfo.Length; i++)
            {
                Console.WriteLine("\nName            : {0}", myFieldInfo[i].Name);
                Console.WriteLine("Declaring Type  : {0}", myFieldInfo[i].DeclaringType);
                Console.WriteLine("IsPublic        : {0}", myFieldInfo[i].IsPublic);
                Console.WriteLine("MemberType      : {0}", myFieldInfo[i].MemberType);
                Console.WriteLine("FieldType       : {0}", myFieldInfo[i].FieldType);
                Console.WriteLine("IsFamily        : {0}", myFieldInfo[i].IsFamily);
            }
        }
    }
    

    您可以选择您的 FeatList 类,而不是从 Main 方法查询此示例中的 FieldInfoClass。逻辑不需要在同一个类的主方法中。您可以将您的逻辑版本放在要查询的实体之外,实际上可以使用这种逻辑查询任何对象或类。

    这些字段是私有的还是公共的或其他什么都没有关系 - 通过反射,您可以访问所有这些。

    请参阅FieldInfo.GetValue(..) method (MSDN link) 的 MSDN 示例代码,了解如何使用反射提取字段的值。

    【讨论】:

    • 有什么方法可以使用这些变量吗?我需要调用它们的方法。比如,if(FeatExample.boolThing){//代码}
    • 我通过在底部添加一个链接来更新答案,该链接显示如何获取字段值 - 一旦你有了值,你就可以用它做任何事情,比如调用它的方法。
    【解决方案3】:

    这将返回一个包含所有 Feat 类型公共字段的 FieldInfo 数组:

    var fields = typeof(Feat).GetFields();
    

    然后你可以像这样读/写字段:

    var field1 = fields[0];
    var field1value = field1.GetValue(Acrobatic);
    

    当然,GetValue 返回无类型的对象,因此您需要根据需要将其转换为正确的类型。

    【讨论】:

    • 您需要指定一个BindingFlag
    • 不,我不知道。默认情况下包含静态、公共和实例字段。
    猜你喜欢
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2021-11-21
    相关资源
    最近更新 更多