6

このアプリケーションでは、EF4.0 と POCO エンティティ ジェネレーターを使用して、データベースからエンティティを生成しています。データ注釈を適用するには、インターフェイスを作成し、作成した部分クラスにそれらのインターフェイスを実装して、EF を使用して生成された部分クラスと一致させます。

/*Entity Generated Type*/
public partial class SomeEntity : EntityBase
{
    public virtual string SomeProperty
    {
        get {...}
        set {...}
    }
}

/*Interface containing metadata*/
public interface ISomeEntityMetadata
{
    [SomeCustomAttribute]
    string SomeProperty { get; set; }
}

/*Partial matching class for interface*/
[MetadataType(typeof(ISomeEntityMetadata))]
public partial class SomeEntity : ISomeEntityMetadata
{
}

ここで、リフレクションを使用して、「SomeEntity.SomeProperty」に「SomeCustomAttribute」が適用されているかどうかを取得しようとすると、属性が適用されていないことが返されます。

生成されたコードを編集して属性を直接適用すると、機能します。
部分クラスが結合して単一の型を形成することを確認すると、そうです。
(リフレクションを使用して) MetadataType 属性が型に適用されているかどうかを確認すると、適用されます。
また、エンティティが WPF の UI 要素にバインドされている場合、検証は正常に機能しますが、リフレクションを使用すると、プロパティに適用された検証属性やカスタム属性を見つけることができません。

どんな助けや指針も魂を救うでしょう。

4

1 に答える 1

9

ただし、属性でマークされたインターフェイス/クラスはMetadataType、これらの属性を元のクラスに追加しないため、リフレクションを使用してクラスでそれらを見つけることはできません。MetadataTypeそれは属性の目的ではありません。リフレクションを使用する場合は、最初に属性を見つけMetadataType、その属性に渡されたタイプを確認し、そのタイプでカスタム属性を検索する必要があります。それがバリデーションで を使用する方法MetadataTypeです。

于 2012-06-20T09:01:56.183 に答える