我希望能够检查类的实例是否存在自定义属性,但我希望能够从该类的构造函数中执行该检查。看看这个伪代码:
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语句是我想填写的内容。这可能吗?
答案 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;
}
}