2015-01-03 1 views
0

Я хотел бы создать атрибут C#, который принимает параметр Type.Могу ли я неявно создавать переменные-члены через атрибуты?

[MyAttribute(typeof(FooBar))] 
public class MyClass 
    { 

Добавление этого атрибута к классу должен, среди прочего, сказать Visual Studio неявно, что этот класс имеет переменную-член этого типа, с именем, полученным из вида.

Например, добавление атрибута с параметром typeof(FooBar) должно неявно создавать переменную-член private FooBar _foobar;.

Я хотел был бы иметь возможность получить доступ к этому члену через autocomplection в IDE, поэтому делать это во время выполнения было бы слишком поздно.

Возможно ли это вообще? Как я мог это достичь?

+1

Не напрямую. Зачем тебе это нужно? – CodeCaster

+0

Чтобы дать вам более качественные ответы, вы должны описать проблему, с которой вы столкнулись, где этот атрибут, который предположительно добавит это поле, будет решением. Это, возможно, даст нам подсказки, которые позволят нам помочь вам с оригинальной проблемой, а не с вашим текущим решением. Разве не наследование классов или интерфейсов не поможет вам с такими требованиями? –

+0

@CodeCaster Я просто искал удобный способ избежать кода плиты котла. Я хочу получить зависимость от центрального источника по типу и сохранить его в переменной-члене. Но я надеялся, что мне не удастся явно определить переменную-член и включить код для извлечения зависимости каждый раз. Вместо этого я хотел бы определить атрибут, который будет сообщать IDE перед компиляцией, что присутствует переменная-член определенного типа и имени и извлекать зависимости во время выполнения в зависимости от существующих атрибутов. –

ответ

2

Не без чего-то, что переписывает ИЛ после того, как компилятор выполнил свою задачу.

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

Один из способов - использовать что-то вроде Postsharp, которое делает то, что я описываю выше.

В общем, Postsharp и подобные системы отделяют окончательную сборку от компилятора .NET, считывают метаданные (атрибуты и другие вещи), а затем восстанавливают сборку с нуля, вводя больше кода в зависимости от этих атрибутов.

Однако, с запасом .NET и C#, нет, это невозможно.


Как @MarcinJuraszek комментариев, это может быть возможным с Рослинами, новой платформой компилятора, что Microsoft собирается запустить. У меня мало опыта в этом, поэтому мой ответ связан с текущими стабильными выпусками, включая .NET 4.5 и C# 5.0.

+0

Возможно, это возможно с перезаписью Рослина. – MarcinJuraszek

+0

Вы правы, это возможно. –

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