Можете ли вы дать члену C # атрибуты другого члена в другом классе? - PullRequest
1 голос
/ 22 ноября 2010

Допустим, у нас есть ситуация, когда у нас есть два класса, ClassA и ClassB, и у них обоих есть метод DoSomething(). ClassB содержит ClassA в качестве поля, и когда вызывается ClassB.DoSomething(), он делегирует вызов ClassA.DoSomething(). Кроме того, ClassA.DoSomething() имеет некоторый атрибут. Итак, у нас есть что-то вроде

class ClassA {
    [SomeAttribute]
    int DoSomething() { return 0; }
}

class ClassB {
    public ClassA CA { get; }
    int DoSomething() { return CA.DoSomething(); }
}

У меня вопрос: есть ли способ применить атрибуты, существующие на ClassA.DoSomething() к ClassB.DoSomething(), не повторяя этот код? Что если ClassA.DoSomething() имеет несколько атрибутов? Есть ли какой-нибудь атрибут, который может выглядеть как [ApplyAttributes(typeof(ClassA), "DoSomething")]?

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

Это для решения Silverlight, поэтому некоторые методы отражения, такие как TypeDescriptors, для меня недоступны.

Ответы [ 2 ]

2 голосов
/ 22 ноября 2010

Я бы создал пользовательский TypeDescriptor , который отвечал бы за анализ вашего атрибута ApplyAttributes и возвращал соответствующие атрибуты во время выполнения.

Я думаю, что это будет легче сделать, чем какой-нибудь грязный шаг сборки, который изменит ваш исходный код перед компиляцией.

0 голосов
/ 22 ноября 2010

Атрибуты - вещь времени выполнения. То есть знание того, какие атрибуты применяются к классу, требует наличия живого экземпляра класса.

Теперь, если / когда Microsoft предоставляет возможность «Компилятор как сервис», вы можете получить эту информацию во время «компиляции» и что-то с ней сделать. По сути, если вы не проанализируете свой файл кода и не измените код C # других классов, во время компиляции невозможно будет сделать то, что вы хотите.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...