私はMetadataType属性クラスを使用してフィールドに属性を適用しようとしています。部分クラスのフィールドにカスタム属性を適用できませんでした。私が従っている例のいくつかはhereとhereです。C#カスタム属性が適用されていません
私の最後の試合は、私が "いくつかの作業をする"ことが要求されるクラスのすべてのフィールドにフラグを立てることです。
以下の例では、フィールド "Name"にFooAttributeを適用したいとします。実際の生活では、私は生成されたコードを扱っています....
私の非常にわかりやすい例では、私は部分的なクラス - 牛、生成されたコードです。
namespace Models
{
public partial class Cow
{
public string Name;
public string Colour;
}
}
FooAttributeを使用するにはNameフィールドが必要です。これを実行しました。
using System;
using System.ComponentModel.DataAnnotations;
namespace Models
{
public class FooAttribute : Attribute { }
public class CowMetaData
{
[Foo]
public string Name;
}
[MetadataType(typeof(CowMetaData))]
public partial class Cow
{
[Foo]
public int Weight;
public string NoAttributeHere;
}
}
これはFooAttributeが適用されたWeightフィールド、のための素晴らしい作品 - 私はそれは部分クラスであるため、ことを期待します。名前フィールドはメタデータから属性を取得しませんが、これが本当に必要です。
私は何が欠けているのですか、それとも間違っていますか?
更新:これは、FooAttributeでフィールドを検索する方法です。
public static void ShowAllFieldsWithFooAttribute(Cow cow)
{
var myFields = cow.GetType().GetFields().ToList();
foreach (var f in myFields)
{
if (Attribute.IsDefined(f, typeof(FooAttribute)))
{
Console.WriteLine("{0}", f.Name);
}
}
}
これの結果は次のとおりです。
重
しかし、私は期待してい:
名前
重
はい、申し訳ありません、 という事は承知しています。私は質問を更新して、どのように属性を探しているかを示します。 – Damo
これは 'Console.WriteLine(fieldInfo.Name);'に 'fooFields [fieldInfo] = foo;'を変更しただけで、ほぼ同じです。必要なものを手に入れます – ASpirin
これは問題ですが、名前フィールドには適用されません。ところで、この行のMetadataClassTypeのためにあなたのサンプルをコンパイルできません:var metaFields = metadataType?.MetadataClassType.GetFields()??新しいFieldInfo [0]; – Damo