使用反射来识别具有给定装饰器的属性



我试图在类中获得属性列表,其中属性标记为装饰器[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"取决于你的对象模型,但我怀疑它在大多数情况下是合适的)。

相关内容

  • 没有找到相关文章

最新更新