如何获取我在一个类中拥有的所有公共变量的列表? (C#)
Posted
技术标签:
【中文标题】如何获取我在一个类中拥有的所有公共变量的列表? (C#)【英文标题】:How do I get a list of all the public variables I have in a Class? (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 个变量。有没有办法将所有这些成员变量放在一个可管理的数组中?还是我把自己搞砸了?
【问题讨论】:
【参考方案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
。
不,我不知道。默认情况下包含静态、公共和实例字段。以上是关于如何获取我在一个类中拥有的所有公共变量的列表? (C#)的主要内容,如果未能解决你的问题,请参考以下文章
试图找到用户在 liferay 6.2 中拥有的所有权限并返回一个 JSON 对象
有没有一种简单的方法可以将我在一个环境中拥有的相同 Python 库安装到新的 Python 环境中? [复制]