CallerMemberName не работает для конструктора атрибутов на поле

Я создаю сериализатор в C# (.NET 4.5, VS 2013), и я использую атрибут для управления метаданными сериализации, такими как имя для хранения члена для чтения и записи. Поскольку я не хочу каждый раз записывать имя члена в качестве аргумента для атрибута, я пытаюсь использовать CallerMemberName.

Для свойств это работает нормально: имя свойства передается при вызове конструктора, а атрибут позволяет мне назначить значение свойства при десериализации.

Для полей по какой-либо причине CallerMemberName отказывается работать. Вместо этого я получаю строку default.Empty каждый раз, даже когда параметры другого аргумента передаются правильно.

Мой текущий код для тестирования это:

class AttributeTest
{
    [VariableAttribute(true)]
    public string testField;

    [VariableAttribute(false)]
    public string testProperty { get; set; }

    static void Main(string[] args)
    {
        Console.WriteLine("spawning");
        AttributeTest test = new AttributeTest();
        test.testField = "sdasd";
        foreach (MemberInfo info in typeof (AttributeTest).GetMembers().Where(x => x.GetCustomAttribute(typeof(VariableAttribute)) != null))
        {

            //Console.WriteLine(info.Name);
            VariableAttribute attr = (VariableAttribute)info.GetCustomAttribute(typeof (VariableAttribute));
            Console.WriteLine(attr.testStore);
        }

        //Console.WriteLine(typeof(AttributeTest).GetMember("testField")[0].GetCustomAttributes().ElementAt(0));

        test.testProperty = "falsdka";
        Console.ReadKey();
    }
}

[AttributeUsage(AttributeTargets.Field|AttributeTargets.Property)]
public class VariableAttribute : System.Attribute
{
    public bool testStore;

    public VariableAttribute(bool test = true, [CallerMemberName] string caller = "")
    {
        testStore = test;
        Console.WriteLine(caller);
    }
}

Я проверил это с полем, не получающим аргументов, с полем, получающим аргумент, чтобы убедиться, что вызывается конструктор, с полем, вызывающим исключение конструктора, чтобы вдвойне убедиться, что конструктор вызывается, и я не могу понять, что я делаю не так

1 ответ

Решение

Как говорится в MSDN, цитата:

Позволяет получить метод или имя свойства вызывающего метода.

Поэтому вам придется найти другой способ сделать то, что вы делаете, или придерживаться свойств.

Другие вопросы по тегам