Проверка вызывающего абонента во время компиляции или можно ли расширить компилятор C#?C#

Место общения программистов C#
Ответить
Anonymous
 Проверка вызывающего абонента во время компиляции или можно ли расширить компилятор C#?

Сообщение Anonymous »

Рассмотрите этот метод и его описание:

Код: Выделить всё

[Description("It must be called from a property, else it is a runtime error.")]
protected T Load()
{
return InternalLoad();
}
Дизайн этого метода требует, чтобы вызывающий объект должен быть свойством, в противном случае InternalLoad выдает ошибку. исключение. Он использует StackFrame для получения имени вызывающего абонента, и если оно не имеет формы get_
или set_, выдается исключение. Все это происходит во время выполнения, что мне не нравится.

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

В крайнем случае, можно ли расширить компилятор C#, который будет использовать специальный атрибут (например, CallableFromAttribute), чтобы убедиться в этом?

Я хочу сделать его максимально гибким:

Код: Выделить всё

[CallableFrom(Caller.Property)] //Caller is an enum
protected T Load()
{
return InternalLoad();
}

[CallableFrom(Caller.Property | Caller.Method)]
protected T SomeOtherLoad()
{
//code
}
а затем

Код: Выделить всё

public string Method()
{
var x = this.SomeOtherLoad(); //okay
var y = this.Load();          //compilation error !!
}
Дайте мне знать, если возникнут какие-либо путаницы. Я уточню это. :-)



Мне нужна эта функция, потому что я пытаюсь реализовать класс PropertyManager, который служит базовым классом для других классов, которым необходимо определять свойства. Типичное использование этого класса будет следующим:

Код: Выделить всё

public sealed Vendor : PropertyManager
{
public string VendorName
{
get { return this.Load(); }
set { this.Store(value); }
}
public DateTime Created
{
get { return this.Load(); }
set { this.Store(value); }
}
}
Здесь методы Load и Store, определенные в базовом классе, обнаруживают имя свойства, из которого они вызываются; рассматривая это имя как ключ, он считывает связанное значение из словаря (в случае Load) или записывает в него (в случае Store). Это вызывает изменение свойств и измененные события. Он также поддерживает отмену, поскольку ProperyMananger может легко отслеживать все изменения, внесенные в свойство.

Подробнее здесь: https://stackoverflow.com/questions/143 ... harp-compi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

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

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»