如何获取类中所有公共变量的列表? (C#)

时间:2010-11-28 05:32:32

标签: c# arrays reflection public member

我有一个有很多公共变量的类,我需要能够得到它们的列表。

以下是我班级的一个例子:

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

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

3 个答案:

答案 0 :(得分:1)

如果“变量”是指类字段(如类级别的变量),则可以使用反射来获取访问权限,就像在此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);
        }
    }
}

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

如果字段是私有的或公共的或其他字段无关紧要 - 通过反射,您可以访问所有字段。

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

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

答案 2 :(得分:0)

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

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

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

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

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

相关问题