0

正しく動作していないように見える次のコードがあります。type ではない 1 つの属性を持つプロパティがありますが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、プロパティが持つ属性ごとに1つのリストを返します(タイプだけでなく、任意の属性FieldMapAttribute)。これは、プロパティがこのように見える場合、

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

次に、selectステートメントは次の結果をもたらします

false
false
true

ご覧のとおりCount、この結果セットを呼び出すと、プロパティに設定されたカスタム属性の数が常に返されます (ここでも、any attribute )。

お役に立てれば。

于 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 に答える