Как получить список всех открытых переменных, которые есть в классе?(С #) - PullRequest
3 голосов
/ 28 ноября 2010

У меня есть класс, который имеет МНОГО открытых переменных, и мне нужно иметь возможность получить их список.

Вот пример моего класса:

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 ]

1 голос
/ 28 ноября 2010

Если под «Переменными» вы подразумеваете поля класса (например, переменные на уровне класса), вы можете использовать отражение для получения доступа, как в этом примере MSDN Microsoft с использованием класса FieldInfo (см. Ссылку MSDN для получения дополнительной информации)

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.Логика не обязательно должна быть в главном методе того же класса.Вы можете разместить свою версию логики вне сущности, которую вы хотите запросить, и фактически запросить любой объект или класс с помощью такой логики.

Неважно, являются ли поля частными или общедоступными, или что-то еще - благодаря размышлению вы можете получить доступ ко всем из них.

См. Пример кода MSDN в Метод FieldInfo.GetValue (..) (ссылка MSDN) , чтобы узнать, как извлечь значение поля с помощью отражения.

1 голос
/ 28 ноября 2010

, если вы ищете varaible 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));
0 голосов
/ 28 ноября 2010

Возвращает массив FieldInfo всех открытых полей типа Feat:

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

Тогда вы можете читать / писать поля, подобные этим:

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

Конечно, GetValue возвращает нетипизированный объект, поэтому вам нужно привести его к нужному типу по требованию.

...