基礎拾遺------特性詳細【共通フィルタ例を含む】

20795 ワード

きそピックアップ
基礎拾遺------特性の詳細
基礎拾遺------webservice詳細
基礎拾遺------redis詳細
基礎拾遺------反射の詳細
基礎拾遺------依頼詳細
基礎拾遺------インタフェースの詳細
基礎拾遺------汎型詳細解
基礎ピックアップ---依存注入
基礎ピックアップ---データ注釈と検証
基礎ピックアップ---mongodb操作
基礎拾遺------RabbitMQ
基礎ピックアップ---CLR
前言
もともと7月に基礎を1ヶ月で拾って書いたと思っていたのに、断続的に4ヶ月も書き続けて、やっとこの数編を書きました.この2、3日はまた何編も書く計画を立てています.頑張ってほしいですね.先日、同僚とチャットをしたことがあり、その存在を知らない同僚もいた.だから週末にまとめました.
1.特性概念
プロパティ(Attribute)は、実行時にプログラム内の様々な要素(クラス、メソッド、構造、列挙、コンポーネントなど)の動作情報を伝達するための宣言ラベルです.プロパティを使用して、プログラムに宣言情報を追加できます.宣言ラベルは、適用される要素の前にカッコ([])を配置することによって記述されます.
プロパティ(Attribute)は、コンパイラ命令やコメント、説明、メソッド、クラスなどの他の情報などのメタデータを追加するために使用されます.たとえば,メソッドを実行する前に,ユーザがこのメソッドを実行する権限があるかどうかを判断し,メソッドに異常が発生した場合にどのように処理するかを判断する.
1.1.列挙
なぜここで列挙するのか、saかどうか、コードを貼り付けます.
 enum Fruit
    {
        [Description("  ")]
        Apple,
        [Description("  ")]
        Orange,
        [Description("  ")]
        Watermelon
    }

Ok、F 12 Descriptionだけで見えます
  public DescriptionAttribute(string description);
こいつ、間違いなくDescriptionAttribute(string description)、それが特性だ.今知っているでしょう.あなたも実は特性を使っています.ただ、あなたは知らないだけです.この冒頭は以前とは違って、くだらない話が少し多い.気まずいから、今帰ってきなさい.
2.定義済み特性
注意:1.プロパティには、2つのプロパティの事前定義プロパティとカスタムプロパティが大きく分けられます.
    2.定義済みのプロパティNetフレームワークには、次の3つの事前定義機能があります.
2.1.AttributeUsage(AttributeUsageAttributeクラス):
  2.1.1.機能:
カスタムプロパティクラスの使用方法について説明します.プロパティが適用できるプロジェクトのタイプを指定します.
  2.1.2.次の操作を行います.
   [AttributeUsage(validon, AllowMultiple = false, Inherited = true)]
  //            (    ClassMsg             )  
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Field, AllowMultiple = true, Inherited = false)]  
    //  MsgAttribute   ,   Attribute    
    public class ClassMsgAttribute : Attribute  
    {  
        //  _msg   Msg  //Msg      msg      
        string _msg;  
        public string Msg { get { return _msg; } set { _msg = value; } }  
        public ClassMsgAttribute() { }  
        //            ,   _msg      
        public ClassMsgAttribute(string s) { _msg = s; }  
    }  

  //  
    // Person    ClassMsg      
    [ClassMsg(Msg = "            ")]  
    class Person  
    {  
        // _name     ClassMsg      
        [ClassMsg("         ")]  
        string _name;  
        //        ,  MsgAttribute                 
        //[ClassMsg("           ")]    
        public string Name { get { return _name; } set { _name = value; } }  
    }    
  
} 

以上、AttributeUsageで使用したときの小さな栗です.
2.1.3.AttributeUsageパラメータはvalidon:列挙器AttributeTargetsの値の組合せである配置された言語要素を示します.デフォルトはAttributeTargetsです.All.
AllowMultiple:この値は、1つのプログラム要素に複数の指示属性インスタンスを指定できるかどうかを示します.複数のインスタンスを指定できる場合はtrueです.そうでなければfalseです.デフォルトはfalseです.
Inherited:この値は、派生クラスと書き換えメンバーによって属性が継承されるかどうかを示します.この属性が派生クラスと書き換えメンバーで継承できる場合はtrue、そうでない場合はfalseです.デフォルトはtrueです. 
2.2.Obsolete(ObsoleteAttributeクラス):
2.2.1.機能:
この単語は廃棄という意味で、実はこの特性もこの方法を捨てて、間違いや警告を生成するために使われています.
2.2.2.使用方法:
   [Obsolete( message, iserror)] 
 [Obsolete("        ", true)]
   static void OldMethod()
   { 
      Console.WriteLine("    ");
   }

2.2.3.Obsoleteパラメータの説明
Message:なぜ廃棄したのか教えてあげましょう
iserrorは、ブール値です.値がtrueの場合、コンパイラはプロジェクトの使用をエラーとします.デフォルトはfalse(コンパイラが警告を生成)
 2.3.Conditional(ConditionalAttributeクラス)
2.3.1.機能:
前処理識別子による実行方法;プリプロセッサ命令については、自分で理解する必要があります.
2.3.2.使用法
   [Conditional( conditionalSymbol)]
c#プリプロセッサ命令が分からないので、これは本当に使えないので、下に書かないでプリプロセッサ命令が分かったら補充しましょう.
3.カスタム特性
3.1.カスタムプロパティ
カスタムプロパティ:カスタムプロパティを使用して、独自のコード構造にコメントを追加することを宣言し、特殊な機能を実現します.これにより、ほとんどのメタデータ・テーブルにアイテム定義と適用情報を記録できます.このような拡張可能なメタデータ情報は、実行時にクエリーされ、コードの実行方法を動的に変更することができる.様々なnet frameworkテクノロジーを使用すると、アドレス特性を利用していることがわかります.開発者がコードの中で彼らの意図を表現するのを容易にすることを目的としている.
3.2.カスタムプロパティの使用
  .Netframeworkクラスライブラリ(fcl)には数百のクラスライブラリが定義されており、独自のコードの様々な要素に使用できます.
栗をいくつか挙げます.
3.2.1.Description:冒頭では、この男を列挙します.はい、Descriptionです.これはフレームワークの中で列挙を定義するためのカスタム特性です.定義は次のとおりです.
[AttributeUsage(AttributeTargets.Field,AllowMultiple =true,Inherited = true)]  
  class DescriptionAttribute:Attribute  
  {  
      private string description;  
      public  string Description  
      {  
          get { return description; }  
      }  
  
      public  DescriptionAttribute(String description)  
      {  
          this.description = description;  
      }  
  }

AttributeTargets.Field:このプロパティがフィールドにのみ使用されていることを示します.DescriptionAttribute(String description)彼のコンストラクション関数には、性フィールドの記述を行うためのパラメータがあります.列挙を操作するときに、この記述を今私たちのページに置いて、辞書で関連付けている方法を考えてみると便利ではないでしょうか.
 
 
 enum Fruit
    {
        [Description("  ")]
        Apple,
        [Description("  ")]
        Orange,
        [Description("  ")]
        Watermelon
    }
 
 

  Flags:用于枚举类型,枚举类型就成为了位标志(big flag)集合。

  Seriaklizable:用与类型,告诉序列化器一个是空的字段可以序列化和反序列化。

  dllimport:用于方法,告诉clr该方法的实现位于指定dll的非托管代码中。

有很多,大家应该都会用得到,在i这大家知道net框架类库中有很多可用的定制特性即可,用的时候多总结慢慢就熟悉了。

3.2.定义自定义特性类

上面写了一大通说特性怎么怎么样,最后根据我们自己的需要定义自己的特性,应该是我们更高一些的需求,其实看net框架中的代码,我们写出自己定义的特性应该很容易。

创建并使用自定义特性包含四个步骤:

3.2.1.声明自定义特性

 
 
[AttributeUsage(AttributeTargets.Class |AttributeTargets.Constructor |AttributeTargets.Field |AttributeTargets.Method |AttributeTargets.Property,AllowMultiple = true)]
public class FlagInfoAttribute : System.Attribute
 
 

注:上面介绍过预定义特性所以也就没什么可讲的,大家应该知道attributeUsage定义的意思吧。所有的特性都是继承system.attribute这个在这强调一下。

3.2.2.构建自定义特性

[AttributeUsage(AttributeTargets.Class |AttributeTargets.Constructor |AttributeTargets.Field |AttributeTargets.Method |AttributeTargets.Property,AllowMultiple = true)]
public class FlagInfoAttribute : System.Attribute
{
string flagInfo="";
bool run=false;
public FlagInfoAttribute ()
{

}
public FlagInfoAttribute (string flagInfo,bool run) { flaginfo=flaginfo; run=dosp; } public FlagInfoAttribute (string flagInfo) { flaginfo=flaginfo; } }

カスタムプロパティの構築は、コンストラクション関数で定義するだけで定義できるクラスとほぼ一致します.
3.2.3.ターゲット要素にカスタムプロパティを適用する
特性の使用方法の上に「【】」と表記して使用すればよい
 
 
[flaginfo("    "true)]
piblic class falgDemo()
 
 

就是这么简单,你是不是了解了特性这个知识点,应该是了解了,但是它是不是还可以更吊一些,前言我说过他叫过滤器,是的过滤器,只有了解到它过滤器的功能你才能真的发现它的厉害。

4.过滤器(Filter)

其实这一块我在通过过滤器实现性能监控(含源码)有用到,只是没进行讲解这个知识点而已。

过滤器的使用让我们在代码运行时的时候对其进行Action运行前,运行后和异常时进行可控性控制。至于例子看上面的博客就行。它解决了我在项目中一个难题,代码很简单,思路很不错。

4.1.授权过滤器(Authorize)

4.1.1.默认授权过滤器Authorize

现在在网上无论是要求身份验证的地方多得是,发邮件,买东西,在博客中下载资源。这里的某些操作,就是要经过验证授权才被允许。在MVC中可以利用Authorize来实现。

 [Authorize]
 public ActionResult Login()
  {
      return View();
  }

このフィルタを使用して認証されない場合、ルーティング構成が正しいとしても404エラーが返されます.
4.1.2.カスタムフィルタ(AuthorizeAttributeを継承)
次の2つの方法を書き換える必要があります.
bool AuthorizeCore(HttpContextBase httpContext):ここでは主に認証の論理処理であり、trueを返すのは認証であり、falseを返すのはそうではない.         
void HandleUnauthorizedRequest(AuthorizationContext filterContext):この方法は、認可に失敗したことを処理します.
 public class MyAuthorizeAttribute:AuthorizeAttribute
    {
        
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
        bool flag=false;
        //    
         return flag;
        }   
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            filterContext.HttpContext.Response.Redirect("/Customer/Login");
        }
    }        
      [MyAuthorize]
        public ActionResult show()
        {
            return View();
        }

以上のコードはよく使われていますが、デフォルトではあまり使われません.
4.2.処理エラーフィルタ(HandleError)
異常を処理するには、try catchを最初に考えたのではないでしょうか.では、ここで少し考えを変えなければなりません.異常があれば必ずしも投げ出すとは限らないので、投げ出しても専門の処理ページが表示されているかどうかはもっといいのではないでしょうか.
4.2.1.デフォルトHandleError
1.このフィルタを使用すると、エラーが発生した場合、デフォルトでViews/Shared/Errorビューにジャンプします.
2.またwebに行きます.configファイルのセクションに次のコードを追加します.
 [HandleError(ExceptionType = typeof(Exception))]
 public ActionResult ThrowErrorLogin()
 {
     throw new Exception("");
 }

ここでExceptionTypeが扱う例外のタイプは、Try/Catch文ブロックでキャッチされるタイプに相当します.
パラメータのプロパティは次のとおりです(F 12で確認できます).
View:例外情報を表示するビューを指定します.ビュー名だけでいいです.このビューファイルはViews/Sharedフォルダに入れます.
Master:使用するマスタービューの名前を指定します.
Order:フィルタが適用される順序を指定します
4.2.2カスタムエラー異常処理(HandleErrorAttribute継承)
書き換える方法void OnException(ExceptionContext filterContext)
オブジェクトExceptionContextのプロパティ:
ActionDescriptor:詳細な操作方法を提供する
Result:詳細な操作方法を提供する
Exception:未処理の例外
ExceptionHandled:この例外の処理が完了したらtrueにすると、他のエラープロセッサがこの例外をキャプチャしたとしても、ExceptionHandlerプロパティでこの例外が処理されたかどうかを判断し、例外の処理を繰り返して新しい問題を起こさないようにすることができます.
4.3.キャッシュフィルタ(OutputCache)
OutputCacheフィルタはキャッシュとして使用され、ユーザーがアプリケーションにアクセスする時間とリソースを節約し、ユーザー体験を向上させます.一般的に私は直接キャッシュ処理をしていますが、このフィルタはあまり使いません.
4.4.カスタムフィルタ
OnActionExecuting実行前、OnActionExecuted実行後、OnResultExecutingが結果を返す前、OnResultExecutedがメソッドを返す後.
カスタムフィルタは,我々の方法全体を良好に制御することが保証されていると言える.
public class MyCustomerFilterAttribute : ActionFilterAttribute
    {
      public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
            filterContext.HttpContext.Response.Write(string.Format( "
Action finish Execute.....
")); } public override void OnActionExecuting(ActionExecutingContext filterContext) { CheckMessage(filterContext); filterContext.HttpContext.Response.Write(string.Format("
Action start Execute.....
")); base.OnActionExecuting(filterContext); } public override void OnResultExecuted(ResultExecutedContext filterContext) { filterContext.HttpContext.Response.Write(string.Format("
Action finish Result.....
")); base.OnResultExecuted(filterContext); } public override void OnResultExecuting(ResultExecutingContext filterContext) { filterContext.HttpContext.Response.Write(string.Format("
Action start Execute.....
")); base.OnResultExecuting(filterContext); } }

運用
 [MyCustomerFilter]
        public ActionResult CustomerFilterTest()
        {
            Response.Write("
"); return View(); }

実行して数順を見てみましょう.これはあなたが理解した後、私はそれがあなたが問題を解決するときの新しい考え方であることを保証します.
ネットワーク攻撃防止ケースのソースコード