Вы не можете сделать это, используя автоматически реализованные свойства, как говорили другие.Но вы могли бы сделать что-то очень похожее, используя абстрактные свойства и Castle DynamicProxy (или аналогичный).
Например, вы могли бы получить код, подобный следующему:
public abstract class Foo : IWithSession
{
public IDictionary<string, object> Session { get; private set; }
protected Foo()
{
Session = new Dictionary<string, object>();
}
[Session]
public abstract int Id { get; set; }
}
Перехватчик, который фактически реализует метод полученияи сеттер будет выглядеть так:
class SessionInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
var method = invocation.Method;
bool isGetter = method.IsSpecialName && method.Name.StartsWith("get_");
bool isSetter = method.IsSpecialName && method.Name.StartsWith("set_");
if (isGetter || isSetter)
{
string propertyName = method.Name.Substring(4);
var property = invocation.TargetType.GetProperty(propertyName);
bool hasSessionAttribute = property.GetCustomAttributes(typeof(SessionAttribute), false).Any();
if (hasSessionAttribute)
{
var session = ((IWithSession)invocation.InvocationTarget).Session;
if (isGetter)
{
invocation.ReturnValue = session[propertyName];
return;
}
else
{
session[propertyName] = invocation.Arguments[0];
return;
}
}
}
invocation.Proceed();
}
}