オブジェクトの状態の妥当性を一度に確認する必要がある場合があります。 たとえば、オブジェクトのすべての必要なフィールドとプロパティが初期化され、nullではないことを確認する必要がある場合があります。 この問題を解決するために、属性が適用されます。
次に、属性宣言の簡単な例を示します。
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property、継承= false、AllowMultiple = false)] シールされたパブリッククラスCheckNullAttribute:Attribute { public CheckNullAttribute() { } }
属性は、継承されないフィールドおよびプロパティに対して宣言され、複数回設定することはできません。 この属性を処理するには、以下に示すいくつかのロジックが必要です(ここでは、最初の記事で説明した拡張メソッドの1つを使用します)。
パブリッククラスCheckNullMembers { public static void Check(タイプp_type、オブジェクトp_obj) { if(p_type == null || p_obj == null) 新しい例外をスローします(「無効なパラメーター」)。 MemberInfo [] _members = p_type.FindMembers(MemberTypes.Field | MemberTypes.Property、 BindingFlags.DeclaredOnly | BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public、 null、null); foreach(_membersのメンバー情報メンバー) { bool _isDef = Attribute.IsDefined(member、typeof(CheckNullAttribute)); if(_isDef) { if(member.GetValue(p_obj)== null) 新しい例外をスロー(String.Format( "{0}は初期化されておらず、null"、member.Name)); } } } }
これはどこに該当しますか? ご存じのように、aps.netでページまたはコントロールを開発する場合、パブリックプロパティを宣言し、マークアップで初期化できます。次のようなものです。
public int? 枝分かれ { 取得; セット; } <uc3:BranchHint ID = "BranchHint1" runat = "server" BranchId =” 12” />
次に、このコードに属性を適用し、検証ロジックを追加します。
[CheckNull()] public int? 枝分かれ { 取得; セット; } protected void Page_Load(オブジェクト送信者、EventArgs e) { if(this.Visible) { CheckNullMembers.Check(this.GetType()。BaseType、this); } }
このコードでは、BranchIdのnullがチェックされ、BranchIdが問題にならない場合は例外がスローされます。
コメント:クラスのタイプとインスタンスはCheckに渡されます。 これは、実行時にこれのページタイプを取得できないため、asp.netは各ページをASP名前空間でラップします。 this.GetType()を介してタイプを取得すると、ページのすべてのプライベートフィールドは表示されません。 この点で、プログラマは処理するタイプを明示的に指定する必要があります。 解決策は完璧ではないかもしれませんが、代わりのオプションを聞いてうれしいです。