Список полей с определенным атрибутом - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь перечислить все поля с определенным Атрибутом, но все еще не совсем понимаю, какой объект GetValue() ожидает.

[AttributeUsage(AttributeTargets.Field, AllowMultiple = true)]
class SerializedAttribute : Attribute
{

}

class Program
{
    [Serialized] public Single AFloat = 100.0f;
    [Serialized] public Single AnotherFloat = 125.5f;
    [Serialized] public Single OnceAgain = 75.0f;

    static void Main(string[] args)
    {

        foreach(FieldInfo field in typeof(Program).GetFields())
        {
            foreach(Attribute attr in field.GetCustomAttributes())
            {
                if (attr is SerializedAttribute)
                {
                    Console.WriteLine("\t" + "Variable name: " + field.Name + "\t" + "Variable value:" + field.GetValue(/*"??????????????"*/));           
                }
            }
        }

        Console.ReadKey();

    }
}

Я пробовал несколько поисков в Google, но, по-видимому, я не очень хорош в решении проблем.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Если у вас есть класс:

public class MyClass
{
     .. fields ..
}

И тогда вы делаете:

foreach (FieldInfo field in typeof( >> MyClass << ).GetFields()) ...

Вы получаете доступ к метаданным (полевая информация) для этого типа.

И затем, если вы хотите получить данные из определенных полей, вам нужно передать MyClass экземпляр методу GetValue(..). Потому что мне нужен источник данных.

Если поле static, это означает, что оно не является частью экземпляра MyClass, поэтому вы просто передаете значение null.

Итак, наконец, вы должны сделать:

var instance = new MyClass();

var value = field.GeValue(instance);
0 голосов
/ 29 августа 2018

GetValue ожидает экземпляр Program

var program = new Program();
foreach (FieldInfo field in typeof(Program).GetFields())
{
    foreach (Attribute attr in field.GetCustomAttributes())
    {
        if (attr is SerializedAttribute)
        {
            Console.WriteLine("\t" + "Variable name: " + field.Name + 
                "\t" + "Variable value:" + field.GetValue(program));
        }
    }
}

Может быть, вы хотите сделать эти свойства static, в этом случае вы передадите null GetValue. Хотя раз вы ищете SerializedAttribute, это не похоже на случай.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...