我在这里有这个自定义属性,它会做一些逻辑
[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");
}
}
所以我想要的是每次我创建该组件类的实例时,它基本上会调用或执行我的属性中的代码来做一些逻辑,但问题是,它不执行我的自定义中的代码属性类。我知道我做错了,有人知道怎么做吗?
答案 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;
}
}
}