伙伴类是否仅适用于数据注释或任何属性?我一直在尝试将ColumnAttribute附加到我的好友类中的一个字段,但它似乎没有在原始类中得到处理。这两个类通过 MetadataType 链接。
2 回答
我的答案不是特定于 DataAnnotations,这是一个关于如何关联类型描述符的全局答案。
创建一个TypeDescriptionProvider
描述类关系的子类(在某些情况下您可以使用现有描述符,例如 ,您可以跳过此部分AssociatedMetadataTypeTypeDescriptionProvider
)。
然后使用TypeDescriptor.AddProvider
或TypeDescriptor.AddProviderTransparent
动态附加它们运行时。
我的建议是有一个具有标记类型列表的服务,并通过它运行所有类型(按需,因此性能成本在应用程序运行时分摊),当处理一个类型时,将类型添加到列表,下次这种类型的请求,你知道它在列表中。
伙伴类技术对于 DataAnnotations 并没有什么特别之处。但是,它仅在您使用的反射代码对该MetadataType
属性执行某些操作时才有效。因此,ASP.NET MVC 是处理伙伴类概念的代码库示例,而 Linq-to-sql 没有。所以,如果你想使用伙伴类来添加一个ColumnAttribute
. 但是,如果您真的需要花哨,Linq-to-SQL 将使用带有映射而不是使用属性的 XML 文档。您可以使用它来构建您的映射,作为您可能使用过伙伴类的实例的替代方案。
如果您需要非常非常花哨,请继续创建您的伙伴类,然后针对您的 Linq 属性修饰类编写您自己的伙伴类感知反射处理程序,并根据您的 DataContext 需求构建 XML 映射文档。你可以用不到 50 行代码做到这一点。