最も有用な属性[終了]


784

私は属性が非常に役立つことを知っています。[Browsable(false)]プロパティタブでプロパティを非表示にできるなど、事前定義されたものがあります。属性を説明するよい質問があります:.NETの属性とは何ですか?

プロジェクトで実際に使用する定義済みの属性(およびその名前空間)は何ですか?


27
何の質問?、ページ全体が素晴らしい説明と素晴らしい答えで溢れています。これを読んでいる間、私は多くの専門家に彼らの見解についてインタビューするような経験を得ました。質問の+100。
Muthu Ganapathy Nathan 2013

私は同意します、このような質問は最も価値のあるものの一部です-それが閉じられるほどSOの有用性が低くなります。
David Thielen

回答:


669

[DebuggerDisplay]デバッグ中にTypeのインスタンスの上にマウスを置くと、Typeのカスタマイズされた出力をすばやく確認するのに非常に役立ちます。例:

[DebuggerDisplay("FirstName={FirstName}, LastName={LastName}")]
class Customer
{
    public string FirstName;
    public string LastName;
}

これはデバッガでどのように見えるかです:

代替テキスト

また、プロパティが設定された[WebMethod]属性CacheDurationにより、Webサービスメソッドの不要な実行を回避できることにも言及する価値があります。


62
うわー、それは知っておくと本当に良いことです。私は通常、ToStringをオーバーライドすることで同じことを達成しましたが、これはより良い方法です。
ブライアン

17
これに注意してください。ToStringよりもCPUからはるかに大きな塊をかみます。
NikolaRadosavljević

1
これを使用して、メソッドの結果を表示することもできます。これは、メソッド(またはproperty-get)に副作用がある場合、非常に混乱するデバッグエクスペリエンスをもたらす可能性があります。
ØyvindSkaar

4
@NikolaRadosavljevićはデバッグ中にのみCPUパワーを消費します
Nickolay Kondratyev 2013

2
@Nickolay Kondratyev:私はすべての詳細を知っているわけではありませんが、いくつかの結論に導くことができる以下のWebサービスのベストプラクティスを調べることができます:blogs.msdn.com/b/jaredpar/archive/2011/03/ 18 /…
NikolaRadosavljević13年

273

System.Obsolete私の意見では、フレームワークで最も有用な属性の1つです。使用されなくなったコードに関する警告を発する機能は非常に便利です。私は、開発者に何かをもう使用しないように伝える方法と、理由を説明して何かを行うためのより良い/新しい方法を指摘する方法が大好きです。

Conditional attributeデバッグの使用のためにあまりにもかなり便利です。これにより、リリース用のソリューションをビルドするときにコンパイルされないデバッグ目的のコードにメソッドを追加できます。

次に、Webコントロールに固有の属性がたくさんありますが、それらはより具体的であり、サーバーコントロールの開発以外には何の用途もありません。


50
System.Obsoleteにパラメーターの1つとして「true」を渡すと、警告がエラーになり、ビルドが中断されます。すべての警告をクリーンアップしたら、明らかにこれを行う必要があります。:)
Adrian Clark、

14
すべての警告をクリーンアップしたら、メソッドを削除する方がいいのではないでしょうか。
ペドロ

10
@Pedro:後方互換性の理由からできない場合があります。プライベートで未使用の場合は、削除してください。
Fantius 2009年

3
@plinth例外をスローすることは、多くの理由から悪い考えです。#1は、Obsolete()を使用する主な理由は、移行フェーズ中にコンパイル済みコードを動作させ続けることができるためです。誰にもメソッドの呼び出しを許可しない場合は、単にそれを削除しないのはなぜですか?
ダンハーバート

17
@plinth 新しいコードがメソッドを使用するのを防ぐためです。古いコードは、メソッドが廃止とマークされている場合はバイナリ互換のままですが、例外をスローすると機能しなくなります。誰かがリフレクションを使用して "Obsolte"フラグを回避している場合、問題はより深刻になります...
Dan Herbert

204

[Flags]かなり便利です。確かに構文上の砂糖ですが、それでもかなりいいです。

[Flags] 
enum SandwichStuff
{
   Cheese = 1,
   Pickles = 2,
   Chips = 4,
   Ham = 8,
   Eggs = 16,
   PeanutButter = 32,
   Jam = 64
};

public Sandwich MakeSandwich(SandwichStuff stuff)
{
   Console.WriteLine(stuff.ToString());
   // ...
}

// ...

MakeSandwich(SandwichStuff.Cheese 
   | SandwichStuff.Ham 
   | SandwichStuff.PeanutButter);
// produces console output: "Cheese, Ham, PeanutButter"

レッピーは私が気づかなかったことを指摘し、それがこの属性に対する私の熱意を弱めています:それはコンパイラーに列挙変数の有効な値としてビットの組み合わせを許可するように指示しませ、コンパイラーは関係なくこれを列挙のために許可します。C ++の背景が透けて見える ... ため息


では、Flags属性は正確には何をしているのでしょうか?
AndreiRînea2008

13
Flags属性がすべてバガーであることを皆さんが理解していることを願っています。TypeConverterを除いて、それはまったく必要ありません/使用されません。
leppie 2008年

3
@leppie:ToString()も同様です。しかし...すごい。何らかの理由で、属性のない列挙型の動作がC ++と同じであると期待していました。または、値が整数を生成します(列挙型パラメーターを期待するメソッドにそのまま渡すことはできません)。今はそうではありません。弱い...わかりました。
Shog9 2008年

2
[フラグ]は実際にはデバッガと.ToString()関数のみを支援します。値は列挙型のいくつかの宣言の組み合わせである可能性があることを認識しています。よくわかりませんが、Intellisenseが列挙型をより効果的に使用するのに役立つかもしれません。
ケンジ

31
[Flags]単なる構文上の糖よりも大きな用途があります。Webサービスを使用しているときに、次のような値SandwichStuff.Cheese | SandwichStuff.Ham | SandwichStuff.Jamが渡された場合、シリアル化/非シリアル化は機能しません。この[Flags]属性がないと、デシリアライザーは値がフラグの組み合わせである可能性があることを認識しません。私のWCFが機能しなかった理由を考えて約2日間費やした後、これを一生懸命学びました。
Anchit

177

[DebuggerStepThrough]System.Diagnosticsが好きです。

これらの1行の何もしないメソッドやプロパティへのステップインを回避するのに非常に便利です(自動プロパティのない初期の.Netで作業する必要がある場合)。短いメソッド、またはプロパティのゲッターまたはセッターに属性を配置すると、デバッガーで「ステップイン」を押しても、すぐに飛ぶことができます。


5
何度も私はこの特性について知っていればいいのに
ウッシャー

1
残念なことに、クロージャで壊れています-詳細については、gregbeech.com / blogs / tech / archive / 2008/10/17 /…を参照してください。
グレッグビーチ、

3
動作することがわかっているWM_Paintコードにも役立ちます:)
ポンディダム2009年

@GregBeechそのURLは.NETエラーを返します。上品!:)
smdrager 2012年

@smdrager-一時的な問題であったに違いありませんが、今日は問題なく動作します。
グレッグブナ

135

その価値については、すべての.NET属性のリストを次に示します。数百あります。

他の人については知りませんが、真剣なRTFMが必要です。


33
投稿されたリストは.net 1.1用です。ここに3.5 msdn.microsoft.com/en-us/library/system.attribute.aspxのリストがあります(少し下にスクロールする必要があります)
kay.one

2
質問のリンクを更新しました。今では3.5のための完全なリストである
R.マルティーニ・フェルナンデスは、

8
実際には、特に3.5ではなく、最新のものにリンクしています。
ブライアンオルティス

1
リストが単なるリンクのリストではなく、名前と説明だったとします。しかたがない。@BrianOrtizは正しいです。リストはバージョン4.5です。
Luminous

対象のフレームワークを変更し、上部に「その他のバージョン」と表示されています。
Novaterata、2015

129

私の投票は Conditional

[Conditional("DEBUG")]
public void DebugOnlyFunction()
{
    // your code here
}

これを使用して、高度なデバッグ機能を備えた関数を追加できます。のようにDebug.Write、デバッグビルドでのみ呼び出されるため、プログラムのメインフローの外部で複雑なデバッグロジックをカプセル化できます。


5
これは#if DEBUGを行うのと同じではありませんか?
Neil N

10
やや、#if DEBUGは、呼び出し側もそれを呼び出さない必要があることを意味しますが、Conditioinalは呼び出しを離れますが、JITで除去されるNOPにします。
Rangoric '14年

23
また、通常は#if DEBUGを呼び出しに使用し、[条件付き]をメソッドに使用します。ですから、100回のデバッグメソッドを呼び出した場合、それをオフにすると、単一のコード変更ではなく、100の問題である
スティーブ・クーパー

13
Rangoricのコメントは微妙に間違っています(少なくともC#の場合):メソッドは変更されずに含まれています。呼び出しサイト自体は省略されます。これにはいくつかの影響があります。パラメーターは評価されず、条件付きメソッドは変更されずにコンパイラーの出力に含まれます。これをリフレクションで確認できます。 msdn.microsoft.com/en-us/library/aa664622.aspx blogs.msdn.com/b/jmstall/archive/2007/10/15/...
マークSowul

97

ユーザーコントロール、カスタムコントロール、またはプロパティグリッドを介して編集するクラスのパブリックプロパティではDisplayName、常にDescriptionDefaultValue属性を使用します。これらのタグは、名前、説明パネル、およびデフォルト値に設定されていない太字の値をフォーマットするために.NET PropertyGridによって使用されます。

[DisplayName("Error color")]
[Description("The color used on nodes containing errors.")]
[DefaultValue(Color.Red)]
public Color ErrorColor
{
    ...
} 

DescriptionXMLコメントが見つからない場合、Visual StudioのIntelliSenseが属性を考慮に入れたいと思います。同じ文を2回繰り返す必要がなくなります。


3
どれも指摘していないと信じていカントDescription列挙型で使用した場合..あなたまで私のためにその最も役立つの
nawfal

68

[Serializable]xmlなどの外部データソースとの間またはリモートサーバーからオブジェクトをシリアル化および逆シリアル化するために常に使用されます。詳細はこちら。


C#はカスタム属性インスタンスではなく[Serializable]のメタデータフラグを発行するため、実際には擬似属性と呼ばれます;)
TraumaPony

1
非常に便利ですが、[Serializable]は完璧にはほど遠いです。それはあなたが望む結果を得るために余りにも多くのいじくりと試行錯誤を必要とします。
2009年

私はその一撃を二番目にしましょう!
John Bubriski

System.NonSerializedAttributeは、自動シリアル化をさらに制御したい場合に役立ちます。
CSharper 2009

補足として、組み込みの.Netシリアライゼーションのパフォーマンスはかなり低く、手作りのコードよりも2桁または3桁遅いなどです。
redcalx 2010年

57

ホフスタットの精神では、[Attribute]属性は非常に便利です。これは、独自の属性を作成する方法だからです。プラグインシステムの実装、Enumsへの説明の追加、複数のディスパッチやその他のトリックのシミュレーションには、インターフェイスではなく属性を使用しました。


13
かっこいいね!プラグインシステムの例と列挙型の説明を見せていただけませんか。これらは両方とも、私が自分で実装したいと思っていることです。
John Bubriski

46

これは、興味深い属性InternalsVisibleToに関する投稿です。基本的には、C ++フレンドアクセス機能を模倣しています。単体テストには非常に便利です。


7
テストできなかった、またはテストできなかったものの単体テストをハッキングするのに便利だと思いませんか?
the_drow

@the_drow:「プライベートアクセサー」について話します:msdn.microsoft.com/en-us/library/ms184807%28v=vs.80%29.aspx
habakuk

@habakuk:そうでもない。内部クラスは、通常は設計の不良が原因で、単体テストのために公開する必要がある場合があります。
the_drow

2
@the_drow:InternalsVisibleToが単体テストにとって悪であるとは言えません。プロジェクトの外からは見えない小さな「ユニット」を作成してテストできます(クリーンで小さなAPIを作成するのに役立ちます)。しかし、何かを単体テストするために「プライベートアクセサ」が必要な場合、おそらく何かが間違っています。
habakuk 2012

10
@the_drow internal公開されていないあなたの主張に同意しません。これは、テストされているアセンブリ内でパブリックであり、アセンブリ内の他のクラスが修正機能を想定できるように、ユニットテストする必要があります。単体テストを行わない場合は、使用するすべてのクラスでその機能をテストする必要があります。
tvanfosson


28

私は、nUnitライブラリから提案[TestFixture]します。[Test]

コードの単体テストは、リファクタリングと体系化されたドキュメントの安全性を提供します。


26
[XmlIgnore]

これにより、保存時に例外を引き起こす可能性のある「親」オブジェクトを(XMLシリアル化では)無視できます。


25

これはフレームワークで適切な名前が付けられておらず、十分にサポートされていないため、パラメーターを必要とするべきではありませんが、この属性は不変クラスの有用なマーカーです。

[ImmutableObject(true)]

6
ドキュメントによると、設計時にのみ使用されます(残念ながら)。
Hans Ke st ing

1
これが設計時のみであることを考えると、おそらく独自のImmutableObjectAttributeクラスを作成する方が良いでしょう-少なくともパラメータを削除することができます。
ロイティンカー2014年

25

[ThreadStatic]属性をスレッドおよびスタックベースのプログラミングと組み合わせて使用するのが好きです。たとえば、残りの呼び出しシーケンスと共有したい値が必要であるが、帯域外(つまり、呼び出しパラメーターの外側)にしたい場合は、次のようなものを使用できます。

class MyContextInformation : IDisposable {
    [ThreadStatic] private static MyContextInformation current;

    public static MyContextInformation Current {
        get { return current; }
    }

    private MyContextInformation previous;


    public MyContextInformation(Object myData) {
       this.myData = myData;
       previous = current;
       current = this;
    }

    public void Dispose() {
       current = previous;
    }
}

私のコードの後半では、これを使用して、私のコードの下流の人々に帯域外のコンテキスト情報を提供できます。例:

using(new MyContextInformation(someInfoInContext)) {
   ...
}

ThreadStatic属性を使用すると、問題のスレッドのみに呼び出しのスコープを設定して、スレッド間のデータアクセスの厄介な問題を回避できます。


そして、どのようにアクセスするのですか?ここで使用例のポイントがわかりません。説明できる?
ビーチウォーカー、2015

@Beachwalker Currentは静的である必要があります。今すぐ編集してください。これMyContextInformation.Currentで、スタック上のアクティブなコンテキストを取得するためにアクセスできます。これは特定のケースで非常に優れた概念であり、私たち(私の会社)のエンジンは多くの目的で使用しています。
Felix K.

23

DebuggerHiddenAttributeデバッグするべきではないコードにステップを回避することができます。

public static class CustomDebug
{
    [DebuggerHidden]
    public static void Assert(Boolean condition, Func<Exception> exceptionCreator) { ... }
}

...

// The following assert fails, and because of the attribute the exception is shown at this line
// Isn't affecting the stack trace
CustomDebug.Assert(false, () => new Exception()); 

また、スタックトレースにメソッドが表示されないようにします。これは、別のメソッドをラップするだけのメソッドがある場合に便利です。

[DebuggerHidden]
public Element GetElementAt(Vector2 position)
{
    return GetElementAt(position.X, position.Y);
}

public Element GetElementAt(Single x, Single y) { ... }

ここで呼び出しGetElementAt(new Vector2(10, 10))て、ラップされたメソッドでエラーが発生した場合、呼び出しスタックには、エラーをスローするメソッドを呼び出しているメソッドが表示されません。


21

DesignerSerializationVisibilityAttributeとても便利です。ランタイムプロパティをコントロールまたはコンポーネントに配置し、デザイナーにそれをシリアル化させたくない場合は、次のように使用します。

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Foo Bar {
    get { return baz; }
    set { baz = value; }
}

4
WinFormsコンポーネントに非常に役立ちます。[Browsable(false)]と組み合わせて使用
Mark Heath

3
良い点- シリアル化されないように必要な[Browsable(false)]場所で、デザイナーのユーザーからそれを隠す[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]ために必要です。
コンフィギュレータ

17

少数の属性だけがコンパイラーサポートを取得しますが、属性の非常に興味深い用途の1つはAOPです。PostSharpは、カスタム属性を使用してメソッドにILを注入し、あらゆる種類の機能を許可します...ログ/トレースは簡単な例ですが、他のいくつかの良い例自動INotifyPropertyChanged実装(ここ)のようなものです。

発生してコンパイラまたはランタイムに直接影響を与えるもの:

  • [Conditional("FOO")] -このメソッドの呼び出し(引数の評価を含む)は、ビルド中に「FOO」シンボルが定義されている場合にのみ発生します
  • [MethodImpl(...)] -同期、インライン化などのいくつかのことを示すために使用されます
  • [PrincipalPermission(...)] -セキュリティチェックをコードに自動的に挿入するために使用
  • [TypeForwardedTo(...)]- 呼び出し元を再構築せずにアセンブリ間でタイプを移動するために使用されます

リフレクションを介して手動でチェックされるものについて-私はSystem.ComponentModel属性の大ファンです。、、のようなもの[TypeDescriptionProvider(...)][TypeConverter(...)][Editor(...)]データバインディングシナリオでの型の動作を完全に変更できます(動的プロパティなど)。


15

コードカバレッジクロールを実行する場合、これらの2つが最上位になると思います。

 [Serializable]
 [WebMethod]

15
[WebMethod]は、Webサービスで公開されるメソッドを装飾するために使用されます。[Serializable]は、アプリドメイン間でオブジェクトを渡すなどの目的でシリアル化できるようにオブジェクトにマークを付けます。
ケブ

15

私は使用しています [DataObjectMethod]最近ます。ObjectDataSource(または他のコントロール)でクラスを使用できるように、メソッドについて説明します。

[DataObjectMethod(DataObjectMethodType.Select)] 
[DataObjectMethod(DataObjectMethodType.Delete)] 
[DataObjectMethod(DataObjectMethodType.Update)] 
[DataObjectMethod(DataObjectMethodType.Insert)] 

より詳しい情報


12

現在のプロジェクトでは、

[ComVisible(false)]

個々のマネージタイプまたはメンバー、またはアセンブリ内のすべてのタイプのCOMへのアクセスを制御します。

より詳しい情報


12
[TypeConverter(typeof(ExpandableObjectConverter))]

(コントロールの)クラスであるプロパティを展開するようにデザイナーに指示します

[Obfuscation]

アセンブリ、タイプ、またはメンバーに対して指定されたアクションを実行するように難読化ツールに指示します。(通常、アセンブリレベルを使用しますが[assembly:ObfuscateAssemblyAttribute(true)]


1
私は推測しましたが、間違っていました。難読化属性は、サードパーティの難読化ツールのヒントにすぎません。デフォルトでは、コンパイラは何も難読化しません。
ダンは、Firelightによって

Visual Studio Pro / Ultimateユーザーは@DanNeelyは無料です!
Chris S

4
DotFuscator Community Editionを参照している場合、提供される保護のレベルは非常に低いため、せいぜい何も考慮に入れられません。
Danは、Firelightによっていじくら

@ricovox私は要約を追加しました
クリスS

9

私が最もよく使用する属性は、XMLシリアル化に関連するものです。

XmlRoot

XmlElement

XmlAttribute

等...

素早くダーティなXMLの解析やシリアライズを行う場合に非常に役立ちます。


8

私が好きな中間層の開発者であること

System.ComponentModel.EditorBrowsableAttribute プロパティを非表示にして、UI開発者が表示する必要のないプロパティに圧倒されないようにすることができます。

System.ComponentModel.BindableAttributeデータバインドする必要がないものもあります。繰り返しになりますが、UI開発者が行う必要のある作業が軽減されます。

DefaultValueはローレンス・ジョンストンが言ったのも好きです。

System.ComponentModel.BrowsableAttribute そしてその Flags定期的に使用されます。

私が使う System.STAThreadAttribute System.ThreadStaticAttribute 必要なときます。

ところで。これらはすべての.Netフレームワーク開発者にとって同様に価値があります。


8

[EditorBrowsable(EditorBrowsableState.Never)]プロジェクトがソリューションにない場合、IntelliSenseからプロパティとメソッドを非表示にすることができます。Fluentインターフェイスの無効なフローを非表示にするのに非常に役立ちます。どのくらいの頻度でGetHashCode()またはEquals()を実行しますか?

MVCの[ActionName("Name")]場合、GetアクションとPostアクションを同じメソッドシグネチャで持つか、アクション名にダッシュを使用することができます。そうしないと、ルートを作成しないと不可能になります。


8

以下の属性も非常に重要であることをここで言及することは重要だと思います。

STAThreadAttribute 

アプリケーションのCOMスレッドモデルがシングルスレッドアパートメント(STA)であることを示します。

たとえば、この属性はWindowsフォームアプリケーションで使用されます。

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

そしてまた...

SuppressMessageAttribute

特定の静的分析ツールルール違反の報告を抑制し、単一のコードアーティファクトに対して複数の抑制を許可します。

例えば:

[SuppressMessage("Microsoft.Performance", "CA1801:ReviewUnusedParameters", MessageId = "isChecked")]
[SuppressMessage("Microsoft.Performance", "CA1804:RemoveUnusedLocals", MessageId = "fileIdentifier")]
static void FileNode(string name, bool isChecked)
{
    string fileIdentifier = name;
    string fileName = name;
    string version = String.Empty;
}

STAThreadは、アプリケーションが起動時に誤って自身の別のインスタンスをスピンオフすることを防ぐために使用されていますか?
ルミナス

7

私の頭上にあるのは、大規模なプロジェクト(〜500k LoC)で実際に使用する定義済み属性のクイックリストです。

フラグ、Serializable、WebMethod、COMVisible、TypeConverter、Conditional、ThreadStatic、Obsolete、InternalsVisibleTo、DebuggerStepThrough。


2
ThreadStaticの+1、これまで誰も言及していないことに驚いて、統計的アプローチも
staafl

6

CodeSmithを介してデータエンティティクラスを生成し、いくつかの検証ルーチンに属性を使用します。次に例を示します。

/// <summary>
/// Firm ID
/// </summary>
[ChineseDescription("送样单位编号")]
[ValidRequired()]
public string FirmGUID
{
    get { return _firmGUID; }
    set { _firmGUID = value; }
}

そして、データエンティティクラスに関連付けられた属性に基づいて検証を行うユーティリティクラスを取得しました。これがコードです:

namespace Reform.Water.Business.Common
{
/// <summary>
/// Validation Utility
/// </summary>
public static class ValidationUtility
{
    /// <summary>
    /// Data entity validation
    /// </summary>
    /// <param name="data">Data entity object</param>
    /// <returns>return true if the object is valid, otherwise return false</returns>
    public static bool Validate(object data)
    {
        bool result = true;
        PropertyInfo[] properties = data.GetType().GetProperties();
        foreach (PropertyInfo p in properties)
        {
            //Length validatioin
            Attribute attribute = Attribute.GetCustomAttribute(p,typeof(ValidLengthAttribute), false);
            if (attribute != null)
            {
                ValidLengthAttribute validLengthAttribute = attribute as ValidLengthAttribute;
                if (validLengthAttribute != null)
                {
                    int maxLength = validLengthAttribute.MaxLength;
                    int minLength = validLengthAttribute.MinLength;
                    string stringValue = p.GetValue(data, null).ToString();
                    if (stringValue.Length < minLength || stringValue.Length > maxLength)
                    {
                        return false;
                    }
                }
            }
            //Range validation
            attribute = Attribute.GetCustomAttribute(p,typeof(ValidRangeAttribute), false);
            if (attribute != null)
            {
                ValidRangeAttribute validRangeAttribute = attribute as ValidRangeAttribute;
                if (validRangeAttribute != null)
                {
                    decimal maxValue = decimal.MaxValue;
                    decimal minValue = decimal.MinValue;
                    decimal.TryParse(validRangeAttribute.MaxValueString, out maxValue);
                    decimal.TryParse(validRangeAttribute.MinValueString, out minValue);
                    decimal decimalValue = 0;
                    decimal.TryParse(p.GetValue(data, null).ToString(), out decimalValue);
                    if (decimalValue < minValue || decimalValue > maxValue)
                    {
                        return false;
                    }
                }
            }
            //Regex validation
            attribute = Attribute.GetCustomAttribute(p,typeof(ValidRegExAttribute), false);
            if (attribute != null)
            {
                ValidRegExAttribute validRegExAttribute = attribute as ValidRegExAttribute;
                if (validRegExAttribute != null)
                {
                    string objectStringValue = p.GetValue(data, null).ToString();
                    string regExString = validRegExAttribute.RegExString;
                    Regex regEx = new Regex(regExString);
                    if (regEx.Match(objectStringValue) == null)
                    {
                        return false;
                    }
                }
            }
            //Required field validation
            attribute = Attribute.GetCustomAttribute(p,typeof(ValidRequiredAttribute), false);
            if (attribute != null)
            {
                ValidRequiredAttribute validRequiredAttribute = attribute as ValidRequiredAttribute;
                if (validRequiredAttribute != null)
                {
                    object requiredPropertyValue = p.GetValue(data, null);
                    if (requiredPropertyValue == null || string.IsNullOrEmpty(requiredPropertyValue.ToString()))
                    {
                        return false;
                    }
                }
            }
        }
        return result;
    }
}
}


5

[System.Security.Permissions.PermissionSetAttribute] 宣言型セキュリティを使用して、PermissionSetのセキュリティアクションをコードに適用できます。

// usage:
public class FullConditionUITypeEditor : UITypeEditor
{
    // The immediate caller is required to have been granted the FullTrust permission.
    [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
    public FullConditionUITypeEditor() { }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.