Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Attribute class not calling constructor

Tags:

c#

attributes

I have created an Attribute, call MyAttribute, which is performing some security and for some reason the Constructor is not being fired, any reason why?

public class Driver
{
    // Entry point of the program
    public static void Main(string[] Args)
    {
        Console.WriteLine(SayHello1("Hello to Me 1"));
        Console.WriteLine(SayHello2("Hello to Me 2"));

        Console.ReadLine();
    }

    [MyAttribute("hello")]
    public static string SayHello1(string str)
    {
        return str;
    }

    [MyAttribute("Wrong Key, should fail")]
    public static string SayHello2(string str)
    {
        return str;
    }


}

[AttributeUsage(AttributeTargets.Method)]
public class MyAttribute : Attribute
{

    public MyAttribute(string VRegKey)
    {
        if (VRegKey == "hello")
        {
            Console.WriteLine("Aha! You're Registered");
        }
        else
        {
            throw new Exception("Oho! You're not Registered");
        };
    }
}
like image 788
Coppermill Avatar asked Mar 18 '10 13:03

Coppermill


2 Answers

Attributes are applied at compile time, and the constructors used only to fill in the properties. Attributes are metadata, and can only be examined at runtime.

In fact, Attributes should not contain any behavior at all.

like image 138
Dave Van den Eynde Avatar answered Nov 09 '22 22:11

Dave Van den Eynde


Actually it fails, but only if you are trying to get attribute properties. Here is an example that fails:

using System;

public class Driver
{
// Entry point of the program
    public static void Main(string[] Args)
    {
        Console.WriteLine(SayHello1("Hello to Me 1"));
        Console.WriteLine(SayHello2("Hello to Me 2"));

        Func<string, string> action1 = SayHello1;
        Func<string, string> action2 = SayHello2;

        MyAttribute myAttribute1 = (MyAttribute)Attribute.GetCustomAttribute(action1.Method, typeof(MyAttribute));
        MyAttribute myAttribute2 = (MyAttribute)Attribute.GetCustomAttribute(action2.Method, typeof(MyAttribute));

        Console.ReadLine();
    }

    [MyAttribute("hello")]
    public static string SayHello1(string str)
    {
        return str;
    }

    [MyAttribute("Wrong Key, should fail")]
    public static string SayHello2(string str)
    {
        return str;
    }


}

[AttributeUsage(AttributeTargets.Method)]
public class MyAttribute : Attribute
{

    public string MyProperty
    {
        get; set;
    }

    public string MyProperty2
    {
        get;
        set;
    }

    public MyAttribute(string VRegKey)
    {
        MyProperty = VRegKey;
        if (VRegKey == "hello")
        {
            Console.WriteLine("Aha! You're Registered");
        }
        else
        {
            throw new Exception("Oho! You're not Registered");
        };

        MyProperty2 = VRegKey;
    }
}
like image 29
Andrew Bezzub Avatar answered Nov 09 '22 22:11

Andrew Bezzub