我试图在类中获得属性列表,其中属性标记为装饰器[Ignore] (SQLite.Net),尽管我相信这个问题适用于任何装饰器。
var ignored = typeof(T)
.GetType()
.GetProperties().Where(p =>
p.GetCustomAttributes<SQLite.Net.Attributes.IgnoreAttribute>())
.ToList();
我已经尝试了这个的各种组合-这里的一个甚至不编译,但访问p. customattributes集合;然而,它没有返回正确的属性。为了完整起见,下面是T中的属性:
private ProductCategory _category;
[Ignore]
public ProductCategory Category
{
get { return _category; }
set
...
请有人指出我在正确的方向在这里-是CustomAttributes甚至正确的地方要寻找这个?
您的代码示例有两个主要问题:
首先,typeof(T)返回一个类型,因此您不需要对它调用GetType()(这样做返回关于 type 类的信息,而不是返回关于"T"的信息)。
第二个问题是你不能在Where lambda中调用"p. getcustomattributes (whatever)",因为这不会产生布尔值结果,你需要调用"p. getcustomattributes (whatever). any()"。
由于GetCustomAttributes调用中的泛型类型参数,您的代码也没有在我的计算机上编译。但我肯定我以前做过!也许我用的是不同版本的框架之类的。
为我工作的代码如下:
var ignored = typeof(T)
.GetProperties()
.Where(p => p.GetCustomAttributes(typeof(IgnoreAttribute), inherit: true).Any())
.ToList();
(你是否需要"inherit: true"取决于你的对象模型,但我怀疑它在大多数情况下是合适的)。