CallerMemberName 不适用于字段上的属性构造函数
CallerMemberName doesn't work for Attribute constructor on a field
我正在用 C#(.NET 4.5、VS 2013)生成一个序列化程序,我正在使用一个属性来控制序列化元数据,例如用于存储成员以供读写的名称。因为我不想每次都写出成员名称作为属性的参数,所以我尝试使用 CallerMemberName。
对于属性,它工作正常:调用构造函数时传递 属性 名称,属性让我在反序列化中分配 属性 值。
对于字段,无论出于何种原因,CallerMemberName 拒绝工作。相反,我每次都得到默认值 string.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);
}
}
我测试了它,字段不接收参数,字段接收参数以确保正在调用构造函数,字段抛出构造函数异常以双重确保构造函数被调用,并且我不知道我做错了什么。
如MSDN所述,引用:
Allows you to obtain the method or property name of the caller to the
method.
所以你必须找到另一种方法来做你正在做的事情,或者坚持使用属性。
我正在用 C#(.NET 4.5、VS 2013)生成一个序列化程序,我正在使用一个属性来控制序列化元数据,例如用于存储成员以供读写的名称。因为我不想每次都写出成员名称作为属性的参数,所以我尝试使用 CallerMemberName。
对于属性,它工作正常:调用构造函数时传递 属性 名称,属性让我在反序列化中分配 属性 值。
对于字段,无论出于何种原因,CallerMemberName 拒绝工作。相反,我每次都得到默认值 string.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);
}
}
我测试了它,字段不接收参数,字段接收参数以确保正在调用构造函数,字段抛出构造函数异常以双重确保构造函数被调用,并且我不知道我做错了什么。
如MSDN所述,引用:
Allows you to obtain the method or property name of the caller to the method.
所以你必须找到另一种方法来做你正在做的事情,或者坚持使用属性。