2010-11-28 55 views
3

我有一个类有很多公共变量,我需要能够得到它们的列表。如何获得我在一个类中拥有的所有公共变量的列表? (C#)

这里是我的类的例子:

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

除了有大约100多个变量。有没有任何可能的方法来获得所有这些成员变量在一个可管理的数组?还是我把自己搞砸了?

回答

0

这将返回壮举类型的所有公共字段的字段信息数组:

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

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

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

五言中,GetValue返回类型化的对象,所以你需要将它按需转换为正确的类型。

+0

你需要指定一个`BindingFlag`。 – 2010-11-28 06:03:15

+0

不,我不知道。默认情况下,包括静态,公共和实例字段。 – 2010-11-29 16:46:26

1

如果“变量”你的意思是类字段(如类级别的变量),你可以使用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); 
     } 
    } 
} 

取而代之的查询在这个MSDN微软例如使用反射获得接入,如本例中的FieldInfoClass从Main方法中可以选择你的FeatList类。逻辑不需要在同一个类的主要方法中。你可以将你的逻辑版本放到你想要查询的实体的外部,并且实际上用这种逻辑来查询任何对象或类。

无论这些字段是私人的还是公共的还是别的什么都没关系 - 通过反射您可以访问所有这些字段。

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

+0

有什么方法可以使用变量吗?我需要调用它们的方法。如果(FeatExample.boolThing){//代码} – UnityPrgmer 2010-11-28 06:48:44

1

,如果你是varaible 名称后面 - 那么这将给予他们给你:

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)); 
相关问题