用里面的逻辑创建自定义属性

时间:2015-04-06 14:33:39

标签: c# .net attributes

我在这里有这个自定义属性,它会做一些逻辑

[AttributeUsage(AttributeTargets.All)]
public class CustomAttribute : Attribute
{
    public CustomAttribute ()
    {
        bool foo = false;
        if (foo)
            Console.WriteLine ("TRUE");
    }
}

然后我想在像我这样的组件类中使用它

[Custom]
public class Component
{
    public void Test()
    {
      console.log("test");
    }
}

所以我想要的是每次我创建该组件类的实例时,它基本上会调用或执行我的属性中的代码来做一些逻辑,但问题是,它不执行我的自定义中的代码属性类。我知道我做错了,有人知道怎么做吗?

3 个答案:

答案 0 :(得分:1)

当实例化类时,它本身不会调用绑定到属性的任何代码,甚至实例化它。只有在使用反射调用属性时才会实例化属性。如果您希望在构造类时处理属性,则必须在Component类的构造函数中调用一个方法,该方法使用反射来分析类的属性。

理想的方法是从具有构造函数逻辑的基类继承:

public class Component : CustomBase
{
    public void Test()
    {
      console.log("test");
    }
}

public abstract class CustomBase
{
    public CustomBase()
    {
        bool foo = false;
        if (foo)
            Console.WriteLine ("TRUE");
    }
}

答案 1 :(得分:1)

您需要致电:

object[] attributes = typeof(MyClass).GetCustomAttributes(true);

某处,因为这是触发属性构造函数运行的代码。 您可以在属性类中创建一个调用此行的方法,并在Component中调用属性方法。

答案 2 :(得分:1)

正如Jason和Cristina所说,你需要考虑使用自定义属性进行代码反射。如果您阅读下面的代码(从第18行到第24行),您可以看到一些注释掉的代码,列出与类型相关联的所有CustomAttributes。

using System;
using System.Collections.Generic;
using System.ComponentModel.Design;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace CustomAttributeTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var customCompo = new Component();
            customCompo.Test();

            //System.Reflection.MemberInfo info = typeof(Component);
            //object[] attributes = info.GetCustomAttributes(true);
            //for (int i = 0; i < attributes.Length; i++)
            //{
            //    System.Console.WriteLine(attributes[i]);

            //}
            Console.ReadLine();

        }
    }

    [CustomAttribute(true)]
    public class Component
    {
        public void Test()
        {

            System.Console.WriteLine("Component contructed");

            var member = typeof(Component);
            foreach (object attribute in member.GetCustomAttributes(true))
            {
                if (attribute is CustomAttribute)
                {
                    //noop
                }
            }


        }
    }


    [AttributeUsage(AttributeTargets.All)]
    public class CustomAttribute : Attribute
    {

        private bool _value;

        //this constructor specifes one unnamed argument to the attribute class
        public CustomAttribute(bool value)
        {
            _value = value;
            Console.WriteLine(this.ToString());

        }


        public override string ToString()
        {
            string value = "The boolean value stored is : " + _value;
            return value;
        }




    }



}