将属性添加到自动生成的代码

时间:2013-09-18 08:51:16

标签: c# attributes partial-classes

我设计了一个数据库,用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不同。。

1 个答案:

答案 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);
        }
    }
}