如何判断使用接口的实例变量是否应用了自定义属性?

时间:2016-02-22 16:59:10

标签: c# custom-attributes

我希望能够检查类的实例是否存在自定义属性,但我希望能够从该类的构造函数中执行该检查。看看这个伪代码:

namespace TestPackage
{
    public class MyAttribute : Attribute { }
    public interface IMyThing { }

    public class MyThing : IMyThing
    {
        private bool HasMyAttribute { get; set; }

        public MyThing()
        {
            if (/* some check for custom attribute */)
            {
                HasMyAttribute = true;
            }
        }
    }

    public class MyWrapper
    {
        [MyAttribute]
        private readonly IMyThing _myThing;

        public MyWrapper()
        {
            _myThing = new MyThing();
        }
    }
}

我有代码评论的if语句是我想填写的内容。这可能吗?

2 个答案:

答案 0 :(得分:2)

属性在代码中静态定义,因此是静态的,它们不绑定到实例。它们适用于此类型的类型或成员。

在您的情况下,您可以使用包装器实现IMyThing并使用它而不是原始类型,然后将该属性应用于类。

[MyAttribute]
public class MyWrapper : IMyThing
{
    private readonly IMyThing _myThing;

    public MyWrapper()
    {
        _myThing = new MyThing();
    }

    public void DoMyThingStuff()
    {
        _myThing.DoMyThingStuff();
    }
}

然后你可以检查这样的属性:

bool CheckAttribute(IMyThing myThing)
{
    Type t = myThing.GetType();
    return t.GetCustomAttributes(typeof(MyAttribute), false).Length > 0;
}

如果传递了原始类的对象,则会得到false。如果传递了包装器对象,则会得到true

您也可以从原始类派生一个类,而不是创建一个包装器。

[MyAttribute]
public class MyDerived : MyThing
{
}

答案 1 :(得分:-1)

使用此构造函数:

public MyThing
{
                HasMyAttribute =false;
                foreach (MemberInfo item in this.GetType().GetCustomAttributes(false))
                {
                        if(item.Name=="MyAttribute")
                            HasMyAttribute =true;
                }

}