0

我有以下似乎不正确的代码。有一个属性有一个不是 type 的属性FieldMapAttribute,但它仍然进入 if 条件,我正在检查与该类型属性匹配的计数。

foreach (PropertyInfo _property in _properties)
{
    var attributes = _property.GetCustomAttributes(false);
    if (attributes.Select(a => a.GetType() == typeof(FieldMapAttribute)).Count() > 0)
    {
        colname = (attributes.Select(a => a.GetType() == typeof(FieldMapAttribute)).Cast<FieldMapAttribute>().First()).DbColumnName;
    }
}

有人可以帮助我了解这里发生了什么吗?

4

2 回答 2

5

假设您要做的是检查FieldMapAttribute属性上是否存在属性,您应该使用

var attributes = _property.GetCustomAttributes(typeof(FieldMapAttribute), false);
if (attributes.Length > 0)
{
    ...
}

另一种选择是使用

if (attributes.OfType<FieldMapAttribute>().Any())

您应该注意您的使用Select方式不正确。Select用于将元素投影到新形式中。您的Select语句返回一个列表bools- 属性具有的每个属性(任何属性,而不仅仅是类型FieldMapAttribute)。这意味着如果您的财产看起来像这样

[SomeAttribute]
[SomeOtherAttribute]
[FieldMapAttribute]
public string MyProp { get; set; }

然后您的 select 语句将产生以下结果

false
false
true

如您所见,调用Count此结果集将始终返回属性上设置的自定义属性的数量(同样,任何属性)。

希望这可以帮助。

于 2012-08-25T19:32:45.200 回答
2

不管你当前的代码到底发生了什么,在我看来它可以写得简单:

foreach (PropertyInfo property in properties)
{
    if (property.IsDefined(typeof(FieldMapAttribute), false))
    {
        colName = property.GetCustomAttributes(typeof(FieldMapAttribute), false)
                          .Cast<FieldMapAttribute>()
                          .First()
                          .DbColumnName;            
    }
}

(请注意,最后一个属性将属性定义为指定列名的属性。这是您想要的吗?)

甚至对整个事情都使用 LINQ:

var attrType = typeof(FieldMapAttribute);
var attr = properties.SelectMany(p => p.GetCustomAttributes(attrType), false)
                     .Cast<FieldMapAttribute>()
                     .FirstOrDefault();
if (attr != null)
{
    colName = attr.DbColumnName;
}
于 2012-08-25T19:52:04.053 回答