2013-09-18 2 views
2

Я разработал базу данных, сгенерировал код C# с sqlmetal, и все это работает.
Теперь я работаю над пользовательским интерфейсом, и я хочу добавить некоторые атрибуты в классы, созданные sqlmetal.
после прочтения этого SO Q & A: Can I define properties in partial classes, then mark them with attributes in another partial class? и это atrticle: 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 reconizes атрибуты Book в функции fun, и dosen't, так что я Не удивительно, что атрибут DisplayName не изменился.

что я делаю неправильно и как это исправить?

(я использую C#, VS 2010 Pro и код, сгенерированный SQLMetal в другой .dll, чем графический интерфейс в)

+0

Вы сэкономите много боли, создавая ViewModels в вашем UI для представления ваших объектов. Они также автоматически позволят атрибуты. –

ответ

1

Обратите внимание, что в потоке вы упомянули один из комментариев сказать: «это не общее решение вопроса, заданного OP. Потребители атрибутов все еще должны знать, чтобы искать класс метаданных, т. е. эти атрибуты не будут возвращены атрибутом.GetCustomAttribute (...)». Это означает, что это не универсальное решение для добавления атрибутов. Это решение, которое требует, чтобы методы, считывающие атрибуты, понимали «MetadataType», а просто переходит в другой класс для дополнительных атрибутов. Это происходит не автоматически.

Я знаю, что это не полный ответ, но я хотел бы предложить какой-то пост-обработки с 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); 
     } 
    } 
} 
+0

спасибо. Мне не очень нравится такой подход. Есть ли другой путь? Я не привязан к атрибутам, мне просто нужен простой способ настроить таблицу. – elyashiv

Смежные вопросы