Home > other >  Get raw value of property attribute using Reflection
Get raw value of property attribute using Reflection

Time:03-31

I need to mark some properties as passwords so that they could be automatically screened. I found a standard attribute for that:

[PasswordPropertyText]
public string ThePassword { get; set; }

Following method checks if the attribute is there:

private static bool _isPassword(PropertyInfo p)
{
    PasswordPropertyTextAttribute passProp = (PasswordPropertyTextAttribute)p.GetCustomAttribute(typeof(PasswordPropertyTextAttribute));
    return (passProp != null); // Additional condition should go here
}

Now I would like to have my own logic here:

  • [PasswordPropertyText] should result in true.
  • [PasswordPropertyText(true)] should result in true.
  • [PasswordPropertyText(false)] should result in false.

but the default value of PasswordPropertyTextAttribute.Password is false when the argument is omitted.

Is there any way to get the raw attribute value?

CodePudding user response:

What you're describing cannot be done using reflection.

Reflection is not looking at the code as it was written: it is looking at the model that results from that code. Since the default constructor for PasswordPropertyTextAttribute passes a false value to another constructor, the model that it produces is indistinguishable from using [PasswordPropertyText(false)].

If you want different behavior from the built-in attribute, I'd recommend creating your own attribute that has the behavior you're looking for instead.

CodePudding user response:

Since attribute constructor information are stored as metadata as well you can get the required information by calling the GetCustomAttributesData method. Have a look at this simple example:

class Program
{
    [PasswordPropertyText]
    public string Password1 { get; set; }

    [PasswordPropertyText(true)]
    public string Password2 { get; set; }

    [PasswordPropertyText(false)]
    public string Password3 { get; set; }

    static void Main(string[] args)
    {
        var props = typeof(Program).GetProperties();
        foreach(var prop in props)
        {
            var attributeData = prop.GetCustomAttributesData().First(x => x.AttributeType == typeof(PasswordPropertyTextAttribute));
            Console.WriteLine($"{prop.Name}: {(attributeData.ConstructorArguments.Cast<CustomAttributeTypedArgument?>().FirstOrDefault()?.Value ?? true)}");
        }
        Console.ReadLine();
    }
}

Output:

Password1: True
Password2: True
Password3: False
  • Related