2011-11-10 10 views
1

コードでC#Auto-Propertyを使うのが好きです。私はそれをはるかに良く見いだしました。最近、Auto-Propertyをどのように使って管理するのか、Sessionに値を格納する方法を知りました。単にいくつかの理由: - セッション項目名 にタイプミスを避ける - 余分なコード を避ける - おそらくViewStateのような他の店舗に拡張するなど誰でもSessionに値を格納するC#.Auto-Propertyを実装しようとしましたか?

これまでのところ私は属性が最良の選択肢だろう思っています。私が掘り下げて実装を開始する前に、誰かがこれを試してみたらどうか不思議です。

など。

[Session] 
public int Id{get;set;} 

代わりの

public int Id{ get{return Session["Id"];} set{Session["Id"] = value;}} 

答えて

4

いいえ、あなたはこれを行うことはできません。

自動的に実装されるプロパティは、希望の実装がフィールドに裏打ちされた「簡単な」プロパティである場合に機能します。これがコンパイラによってサポートされているすべてです。自動的に実装されるプロパティを "調整"できる唯一の方法は、getterとsetterのアクセシビリティを別々に設定することです。

もちろん、作成時にセッションから自動的に値を読み込み、特定のメソッド呼び出しでセッションに保存するコードを書くこともできますが、それは実際には同じことではありません。

1

あなたはこれをvanilla C#で行うことはできませんが、面倒なことが起こる可能性があります。

PostsharpはAOPのための良い出発点である:他の人が言ったようにあなたは、自動的に実装プロパティを使用してこれを行うことはできません

http://www.sharpcrafters.com/

1

。しかし、抽象的なプロパティと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(); 
    } 
} 
+0

は、いくつかのことをしようとします、感謝を方向を指示するためのものです。 –