我有一个有很多公共变量的类,我需要能够得到它们的列表。
以下是我班级的一个例子:
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 :(得分: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返回无类型对象,因此您需要根据需要将其强制转换为正确的类型。