Код: Выделить всё
[Description("It must be called from a property, else it is a runtime error.")]
protected T Load()
{
return InternalLoad();
}
или 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); }
}
}
Подробнее здесь: https://stackoverflow.com/questions/143 ... harp-compi
Мобильная версия