Добавить атрибут в класс другой сборки - PullRequest
4 голосов
/ 29 ноября 2011

Можно ли как-то расширить тип, который определен в другой сборке, чтобы добавить атрибут к одному из его свойств?

Пример, который я имею в сборке FooBar:

public class Foo
{
   public string Bar { get; set; }
}

Но в моей сборке пользовательского интерфейса я хочу передать этот тип стороннему инструменту, и для правильной работы этого стороннего инструмента мне нужно, чтобы свойство Bar имело определенный атрибут.Этот атрибут определен в сторонней сборке, и я не хочу ссылки на эту сборку в моей сборке FooBar, так как FooBar содержит мой домен и это инструмент пользовательского интерфейса.

Ответы [ 4 ]

6 голосов
/ 29 ноября 2011

Вы не можете , если сторонний инструмент использует стандартное отражение для получения атрибутов для вашего типа.

Вы можете , если третий -Утилита party использует API TypeDescriptor для получения атрибутов вашего типа.

Пример кода для дескриптора типа:

public class Foo
{
    public string Bar { get; set; }
}

class FooMetadata
{
    [Display(Name = "Bar")]
    public string Bar { get; set; }
}

static void Main(string[] args)
{
    PropertyDescriptorCollection properties;

    AssociatedMetadataTypeTypeDescriptionProvider typeDescriptionProvider;

    properties = TypeDescriptor.GetProperties(typeof(Foo));
    Console.WriteLine(properties[0].Attributes.Count); // Prints X

    typeDescriptionProvider = new AssociatedMetadataTypeTypeDescriptionProvider(
        typeof(Foo),
        typeof(FooMetadata));

    TypeDescriptor.AddProviderTransparent(typeDescriptionProvider, typeof(Foo));

    properties = TypeDescriptor.GetProperties(typeof(Foo));
    Console.WriteLine(properties[0].Attributes.Count); // Prints X+1
}

Если вы запустите этот код, вы увидите, что последнийвывод на консольную запись плюс один атрибут, поскольку атрибут Display теперь также рассматривается.

1 голос
/ 29 ноября 2011

Нет.Невозможно добавить атрибуты к типам из отдельных сборок.

Что вы можете сделать, так это создать собственный тип, который включает сторонний тип.Поскольку у вас есть полный контроль над вашим классом-оберткой, вы можете добавить туда атрибуты.

0 голосов
/ 30 ноября 2011

Мне кажется, что вам нужен какой-то уровень адаптера, который не позволит этой инфраструктурной зависимости просочиться в логику вашего домена.Возможно, вы сможете создать класс адаптера, который будет похож на объект передачи данных другой технологии.Этот класс находится в интеграционной сборке, которая зависит от сторонней библиотеки:

public class FooDTO {
   [TheirAttribute]
   public string Bar { get; set; }
}

Затем можно использовать что-то вроде AutoMapper , чтобы облегчить задачу смены представлений.

Идеальным решением, однако, было бы, если бы сторонняя библиотека поддерживала дополнительные способы предоставления метаданных о своих операциях.Может быть, вы можете попросить их об этой функции.

0 голосов
/ 29 ноября 2011

А как же:

public class Foo
{
    public virtual string Bar
}

public class MyFoo : Foo
{
     [yourcustomattribute]
     public overrides string Bar
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...