我设计了一个数据库,用sqlmetal生成了c#代码,一切正常。
现在,我正在使用UI,我想为sqlmetal创建的类添加一些属性
在阅读了这篇SO Q& A:Can I define properties in partial classes, then mark them with attributes in another partial class?以及此文章后:MSDN - MetadataTypeAttribute Class我尝试了以下内容:
[MetadataType(typeof(GUI.metadata.BooksMetaData))]
public partial class Book
{
public void fun()
{
}
}
namespace GUI.metadata
{
public class BooksMetaData
{
[DisplayName("hello")]
public object Shelf { get; set; }
}
}
我检查了VS是否在函数Book
中重新协调了fun
的属性,并且它没有,所以我并不担心DisplayName
属性没有变化。< / p>
我做错了什么以及如何解决它?
(我正在使用c#,VS 2010专业版,而sqlmetal生成的代码与GUI不同。。
答案 0 :(得分:2)
请注意,在你提到的帖子中,其中一条评论说:“它不是OP提出的问题的一般解决方案。属性的消费者仍然需要知道寻找元数据类 - 即Attribute.GetCustomAttribute(...)不会返回这些属性。“ 这意味着它不是添加属性的通用解决方案。这是一个解决方案,它要求读取属性的方法理解“MetadataType”a只是去另一个类获取其他属性。它不会自动发生。
我知道这不是一个完整的答案,但我建议使用Mono.Cecil进行某种后期处理,例如:
// pseudo code!
// for every type in assembly...
foreach (var targetType in assembly.Types)
{
// find type which adds attributes to original type
var sourceTypeName = targetType.Name + "Attributes";
var sourceType = assembly.Types.FirstOfDefault(t => t.Name = sourceTypeName);
if (sourceType == null) continue; // no type adding attributes
// for each property in this type...
foreach (var targetProperty in targetType.Properties)
{
// find property which is supposed to have additional attributes
var sourceProperty = sourceType.Properties.FirstOfDefault(
p => p.Name = targetProperty.Name);
if (sourceProperty == null) continue; // no such property
// copy attributes
foreach (var sourceAttribute in sourceProperty.Attributes)
{
targetProperty.Attributes.Add(sourceAttribute);
}
}
}