通过MetadataType属性获取应用于生成实体的自定义属性

时间:2012-06-20 07:40:53

标签: reflection entity-framework-4 metadatatype

在我们的应用程序中,我们使用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
{
}

现在,使用反射,当我们尝试获取'SomeCntomAttribute'应用于'SomeEntity.SomeProperty'时,它返回该属性未应用。

如果我们编辑生成的代码并直接应用属性,它就可以工作 如果我们检查合并为形成单一类型的部分类,则确实如此 如果我们检查要在类型上应用的MetadataType属性(使用反射),则为。
此外,当实体绑定到任何WPF的UI元素时,验证工作正常,但使用反射我们无法找到应用于属性的验证属性和/或自定义属性。

任何帮助或指示都会拯救灵魂。

1 个答案:

答案 0 :(得分:9)

但是标有MetadataType属性的接口/类永远不会将这些属性添加到原始类中,因此您永远无法在具有反射的类中找到它们。这不是MetadataType属性的目的。如果要使用反射,必须先查找MetadataType属性,检查传递给该属性的类型并搜索该类型的自定义属性。这就是验证使用MetadataType的方式。