如何获取我在一个类中拥有的所有公共变量的列表? (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 环境中? [复制]

除了使用纯虚拟外,如何通过基类从派生类中获取成员

如何无限制地从 Cloudinary API 获取所有图像或如何使用 next_cursor?

PHP 类中的变量是如何分配的? [复制]