Attributi più utili [chiuso]


784

So che gli attributi sono estremamente utili. Ce ne sono alcuni predefiniti come quelli [Browsable(false)]che ti permettono di nascondere le proprietà nella scheda delle proprietà. Ecco una buona domanda che spiega gli attributi: Cosa sono gli attributi in .NET?

Quali sono gli attributi predefiniti (e il loro spazio dei nomi) che usi effettivamente nei tuoi progetti?


27
Che domanda? , l'intera pagina è piena di bellissime risposte con spiegazioni meravigliose. Mentre sto leggendo questo, ho avuto esperienza come intervistare molti esperti sulla loro visione. +100 per la domanda.
Muthu Ganapathy Nathan

Sono d'accordo, domande come queste sono alcune delle più preziose: rende COSÌ meno utile da chiudere.
David Thielen,

Risposte:


669

[DebuggerDisplay]può essere davvero utile per visualizzare rapidamente l'output personalizzato di un tipo quando si passa con il mouse sull'istanza del tipo durante il debug. esempio:

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

Ecco come dovrebbe apparire nel debugger:

testo alternativo

Inoltre, vale la pena ricordare che l' [WebMethod]attributo con CacheDurationset di proprietà può evitare l'esecuzione non necessaria del metodo del servizio Web.


62
Wow, è davvero bello saperlo. Di solito ho realizzato la stessa cosa ignorando ToString, ma questo è meglio.
Brian,

17
Fai attenzione, morde dalla CPU molto più grande di ToString.
Nikola Radosavljević il

1
Puoi anche usarlo per visualizzare il risultato dei metodi. Questo può rendere l'esperienza di debug piuttosto confusa se il metodo (o proprietà-get) ha effetti collaterali.
Øyvind Skaar,

4
@ NikolaRadosavljević avrebbe assorbito potenza della CPU solo durante il debug
Nickolay Kondratyev

2
@Nickolay Kondratyev: Non conosco tutti i dettagli, ma puoi dare un'occhiata alle seguenti migliori pratiche del servizio web che possono portarti ad alcune conclusioni: blogs.msdn.com/b/jaredpar/archive/2011/03/ 18 /…
Nikola Radosavljević,

273

System.Obsoleteè uno degli attributi più utili nel framework, secondo me. La possibilità di generare un avviso sul codice che non deve più essere utilizzato è molto utile. Adoro avere un modo per dire agli sviluppatori che qualcosa non dovrebbe più essere usato, così come avere un modo per spiegare perché e indicare il modo migliore / nuovo di fare qualcosa.

Il Conditional attributeè piuttosto comodo anche per l'utilizzo di debug. Ti consente di aggiungere metodi nel tuo codice per scopi di debug che non verranno compilati quando crei la tua soluzione per il rilascio.

Quindi ci sono molti attributi specifici dei controlli Web che trovo utili, ma quelli sono più specifici e non hanno alcun uso al di fuori dello sviluppo dei controlli server da quello che ho trovato.


50
È possibile passare "true" come uno dei parametri a System.Obsolete che fa sì che l'avviso diventi un errore, interrompendo quindi la generazione. Ovviamente questo dovrebbe essere fatto dopo aver ripulito tutti gli avvisi. :)
Adrian Clark,

14
Dopo aver ripulito tutti gli avvisi, non sarebbe meglio eliminare il metodo?
Pedro,

10
@Pedro: a volte non è possibile per motivi di compatibilità all'indietro. Se è privato e inutilizzato, sì, eliminalo.
Fantius,

3
@plinth Lanciare un'eccezione sarebbe una cattiva idea per molti motivi, essendo il n. 1 che il motivo principale per usare Obsolete () è che puoi continuare a far funzionare il codice compilato durante una fase di transizione. Se non stai permettendo a nessuno di chiamare il metodo, perché non cancellarlo?
Dan Herbert,

17
@plinth Serve a impedire che il nuovo codice utilizzi il metodo. Il vecchio codice rimarrà compatibile binario se un metodo è contrassegnato come obsoleto, ma smetterà di funzionare se si genera un'eccezione. Se qualcuno sta usando la riflessione per aggirare la bandiera "Obsolte", allora hai problemi peggiori ...
Dan Herbert,

204

[Flags]è abbastanza utile. Zucchero sintattico per essere sicuri, ma comunque piuttosto carino.

[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"

Leppie sottolinea qualcosa che non avevo realizzato e che piuttosto smorza il mio entusiasmo per questo attributo: non indica al compilatore di consentire combinazioni di bit come valori validi per le variabili di enumerazione, il compilatore lo consente indipendentemente dalle enumerazioni. Il mio background C ++ che mostra attraverso ... sigh


Cosa fa esattamente l'attributo Flags?
Andrei Rînea,

13
Spero che voi ragazzi realizziate che l'attributo Flags incula tutto. Non è necessario / utilizzato affatto, ad eccezione del TypeConverter.
leppie,

3
@leppie: anche ToString (). Ma ... wow. Per qualche ragione, mi aspettavo che il comportamento delle enumerazioni senza l'attributo fosse lo stesso di C ++: o i valori avrebbero prodotto un numero intero (non può essere passato così com'è al metodo che prevede enum param). Vedo ora che non è così. Debole ... ok, enum .NET fanno schifo.
Shog9

2
[Flags] aiuta davvero solo il debugger e le funzioni .ToString () a sapere che un valore è potenzialmente una combinazione di diverse dichiarazioni nell'enum. Non sono sicuro, potrebbe fare in modo che Intellisense ti aiuti a usare l'enum in modo più efficace.
Kenzi,

31
[Flags]ha un uso maggiore dell'essere solo zucchero sintattico. Durante l'utilizzo dei servizi Web, la serializzazione / deserializzazione non funzionerà se SandwichStuff.Cheese | SandwichStuff.Ham | SandwichStuff.Jamviene passato un valore simile . Senza l' [Flags]attributo il deserializzatore non saprà che il valore può essere una combinazione di flag. L'ho imparato nel modo più duro dopo aver trascorso circa due giorni a pensare al motivo per cui il mio WCF non funzionava.
Anchit

177

Mi piace [DebuggerStepThrough]da System.Diagnostics .

È molto utile per evitare di entrare in quei metodi o proprietà del fare una sola riga (se sei costretto a lavorare in una .Net iniziale senza proprietà automatiche). Metti l'attributo su un metodo breve o sul getter o sul setter di una proprietà, e volerai subito anche quando premi "step in" nel debugger.


5
Tante volte vorrei sapere di questa proprietà
Wusher,

1
Solo un peccato è rotto con le chiusure - vedi gregbeech.com/blogs/tech/archive/2008/10/17/… per maggiori informazioni.
Greg Beech,

3
Utile anche per qualsiasi codice WM_Paint che conosci funziona :)
Pondidum,

@GregBeech Quell'URL restituisce un errore .NET. Classy! :)
smdrager,

@smdrager - Deve essere stato un problema temporaneo, sembra funzionare oggi per me.
Greg Beech,

135

Per quello che vale, ecco un elenco di tutti gli attributi .NET . Ce ne sono diverse centinaia.

Non conosco nessun altro, ma ho qualche serio RTFM da fare!


33
l'elenco pubblicato è per .net 1.1 ecco l'elenco per 3.5 msdn.microsoft.com/en-us/library/system.attribute.aspx (devi scorrere un po 'verso il basso)
kay.one

2
Aggiornato il link nella domanda. Ora è l'elenco completo per 3.5
R. Martinho Fernandes,

8
In realtà questo si collega all'ultimo, non 3.5 in particolare.
Brian Ortiz,

1
Ora, se solo l'elenco non fosse solo un elenco di collegamenti, ma il nome e la descrizione. Oh bene. @BrianOrtiz ha ragione. L'elenco è alla versione 4.5.
Luminoso

Basta cambiare il framework che si sta prendendo di mira in alto dove dice "Altre versioni".
Novaterata,

129

Il mio voto sarebbe per Conditional

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

Puoi usarlo per aggiungere una funzione con funzionalità di debug avanzate; ad esempio Debug.Write, viene chiamato solo nelle build di debug e quindi consente di incapsulare una logica di debug complessa al di fuori del flusso principale del programma.


5
non è lo stesso di fare # se DEBUG?
Neil N

10
In qualche modo, #if DEBUG significa che anche il chiamante non deve chiamarlo, mentre Conditioinal lascia la chiamata ma lo rende un NOP che viene eliminato in JIT.
Rangoric,

23
Inoltre, in genere si utilizza #if DEBUG attorno alle chiamate e [Condizionale] ai metodi . Quindi, se si chiama un metodo di debug 100 volte, disattivarlo è una questione di una singola modifica del codice, non 100.
Steve Cooper

13
Il commento di Rangoric è sottilmente sbagliato (almeno per C #): il metodo è incluso non modificato; il sito di chiamata stesso viene omesso. Ciò ha alcune implicazioni: i parametri non vengono valutati e il metodo condizionale è contenuto, non modificato, nell'output del compilatore. Puoi verificarlo con la riflessione. msdn.microsoft.com/en-us/library/aa664622.aspx blogs.msdn.com/b/jmstall/archive/2007/10/15/...
Mark Sowul

97

Io uso sempre la DisplayName, Descriptione DefaultValuegli attributi su proprietà pubbliche dei miei controlli utente, i controlli personalizzati o qualsiasi classe Io modificare attraverso una griglia di proprietà. Questi tag vengono utilizzati da .NET PropertyGrid per formattare i valori di nome, pannello di descrizione e grassetto che non sono impostati sui valori predefiniti.

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

Vorrei solo che IntelliSense di Visual Studio avrebbe preso Descriptionin considerazione l' attributo se non fosse stato trovato alcun commento XML. Eviterebbe di dover ripetere la stessa frase due volte.


3
Non riesco a credere che nessuno abbia sottolineato Descriptionfino a te .. È il più utile per me se usato con gli enum ..
nawfal

68

[Serializable]viene utilizzato continuamente per serializzare e deserializzare oggetti da e verso origini dati esterne come xml o da un server remoto. Maggiori informazioni qui.


In realtà è riferito a un psuedoattribute, in quanto C # emette un flag di metadati per [Serializable], non un'istanza di attributo personalizzata;)
TraumaPony,

1
Sebbene molto utile [serializzabile] è tutt'altro che perfetto. Richiede troppi armeggi, prove ed errori per ottenere il risultato desiderato.
shoosh

Secondo, shoosh!
John Bubriski

System.NonSerializedAttribute è utile se si desidera un maggiore controllo sulla serializzazione automatica.
CSharper,

Come nota a margine, aggiungerei che le prestazioni della serializzazione .Net integrata sono piuttosto scarse, come 2 o 3 ordini di grandezza più lenti del codice creato a mano.
redcalx,

57

Nello spirito di Hofstadt, l' [Attribute]attributo è molto utile, poiché è il modo in cui crei i tuoi attributi. Ho usato gli attributi invece delle interfacce per implementare i sistemi di plugin, aggiungere descrizioni a Enum, simulare più invii e altri trucchi.


13
Sembra fantastico! Ti dispiacerebbe mostrare alcuni esempi del sistema di plugin e le descrizioni enum? Sono entrambe cose che mi interessano implementare!
John Bubriski

46

Ecco il post sull'attributo interessante InternalsVisibleTo . Fondamentalmente ciò che fa imita la funzionalità di accesso agli amici C ++. È molto utile per i test unitari.


7
Non intendi a portata di mano per hackerare un unit test su qualcosa che non potrebbe / non dovrebbe essere testato?
the_drow,

@the_drow: Lei parla di 'funzioni di accesso privati': msdn.microsoft.com/en-us/library/ms184807%28v=vs.80%29.aspx
Habakuk

@habakuk: Non proprio. Ci sono casi in cui le classi interne dovrebbero essere esposte per i test unitari, di solito a causa della cattiva progettazione.
the_drow,

2
@the_drow: non direi che InternalsVisibleTo è male per i test unitari; puoi creare e testare "unità" più piccole che non sono visibili al di fuori del tuo progetto (ti aiuta ad avere un'API pulita e piccola). Ma se hai bisogno di "accessori privati" per testare qualcosa, probabilmente c'è qualcosa che non va.
Habakuk,

10
@the_drow Non sono d'accordo con la tua affermazione che internalnon è pubblica. È pubblico all'interno dell'assembly che viene testato e deve essere testato in unità in modo che altre classi all'interno dell'assembly possano assumere la sua funzionalità di correzione. Se non lo collaudi, dovrai testarne le funzioni in tutte le classi consumanti.
tvanfosson,


28

Suggerirei [TestFixture]e [Test]- dalla libreria nUnit .

I test unitari nel codice forniscono sicurezza nel refactoring e nella documentazione codificata.


26
[XmlIgnore]

in quanto ciò consente di ignorare (in qualsiasi serializzazione xml) oggetti "parent" che altrimenti causerebbero eccezioni durante il salvataggio.


25

Non è ben definito, non ben supportato nel framework e non dovrebbe richiedere un parametro, ma questo attributo è un marcatore utile per le classi immutabili:

[ImmutableObject(true)]

6
Secondo i documenti, utilizzato solo in fase di progettazione (purtroppo).
Hans Ke il

1
Dato che questo è solo in fase di progettazione, forse sarebbe meglio creare la tua ImmutableObjectAttributeclasse - almeno potresti eliminare il parametro.
Roy Tinker,

25

Mi piace usare l' [ThreadStatic]attributo in combinazione con la programmazione basata su thread e stack. Ad esempio, se voglio un valore che voglio condividere con il resto di una sequenza di chiamate, ma voglio farlo fuori banda (cioè al di fuori dei parametri di chiamata), potrei impiegare qualcosa del genere.

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;
    }
}

Più avanti nel mio codice, posso utilizzarlo per fornire informazioni contestuali fuori banda alle persone a valle del mio codice. Esempio:

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

L'attributo ThreadStatic mi consente di estendere la chiamata solo al thread in questione evitando il disordinato problema di accesso ai dati tra thread.


e come accedervi allora? Non capisco il punto del tuo esempio di utilizzo qui. Puoi spiegare?
Beachwalker,

@Beachwalker Current dovrebbe essere statico, modificato ora. Ora puoi accedere MyContextInformation.Currentper ottenere il contesto attivo nello stack. Questo è qualcosa che è un ottimo concetto in alcuni casi, il nostro motore (della mia compagnia) lo usa per molti scopi.
Felix K.

23

Il DebuggerHiddenAttribute che permette di evitare passo in codice che non dovrebbe essere debug.

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()); 

Inoltre impedisce di mostrare metodi nella traccia dello stack, utile quando si ha un metodo che avvolge solo un altro metodo:

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

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

Se ora si chiama GetElementAt(new Vector2(10, 10))e si verifica un errore nel metodo wrapped, lo stack di chiamate non mostra il metodo che chiama il metodo che genera l'errore.


21

DesignerSerializationVisibilityAttributeè molto utile Quando si inserisce una proprietà di runtime su un controllo o un componente e non si desidera che il designer la serializzi, la si utilizza in questo modo:

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

4
molto utile per i componenti di WinForms. utilizzare insieme a [Sfogliabile (falso)]
Mark Heath

3
Un buon punto: [Browsable(false)]è necessario nasconderlo all'utente del progettista, dove [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]è richiesto in modo che non venga serializzato.
configuratore

17

Solo pochi attributi ottengono il supporto del compilatore, ma un uso molto interessante degli attributi è in AOP: PostSharp usa i tuoi attributi su misura per iniettare IL in metodi, consentendo ogni tipo di abilità ... log / trace sono esempi banali - ma alcuni altri buoni esempi sono cose come l'implementazione automatica di INotifyPropertyChanged ( qui ).

Alcuni che si verificano e influiscono direttamente sul compilatore o sul runtime :

  • [Conditional("FOO")] - le chiamate a questo metodo (inclusa la valutazione dell'argomento) si verificano solo se durante la compilazione viene definito il simbolo "FOO"
  • [MethodImpl(...)] - usato per indicare alcune cose come sincronizzazione, allineamento
  • [PrincipalPermission(...)] - utilizzato per inserire automaticamente i controlli di sicurezza nel codice
  • [TypeForwardedTo(...)]- utilizzato per spostare i tipi tra assiemi senza ricostruire i chiamanti

Per le cose che vengono controllate manualmente tramite la riflessione, sono un grande fan degli System.ComponentModelattributi; cose come [TypeDescriptionProvider(...)], [TypeConverter(...)]e [Editor(...)]che possono cambiare completamente il comportamento dei tipi negli scenari di associazione dei dati (es. proprietà dinamiche ecc.).


15

Se dovessi eseguire una scansione della copertura del codice, penso che questi due sarebbero i migliori:

 [Serializable]
 [WebMethod]

15
[WebMethod] è usato per decorare un metodo esposto in un servizio web. [Serializable] contrassegna i tuoi oggetti in modo tale che possano essere serializzati per scopi come passarli attraverso i domini delle app.
Kev,

15

Ho usato [DataObjectMethod]ultimamente. Descrive il metodo in modo da poter utilizzare la classe con ObjectDataSource (o altri controlli).

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

Ulteriori informazioni


12

Nel nostro progetto attuale, usiamo

[ComVisible(false)]

Controlla l'accessibilità di un singolo tipo o membro gestito, o di tutti i tipi all'interno di un assembly, a COM.

Ulteriori informazioni


12
[TypeConverter(typeof(ExpandableObjectConverter))]

Indica al designer di espandere le proprietà che sono classi (di tuo controllo)

[Obfuscation]

Indica agli strumenti di offuscamento di eseguire le azioni specificate per un assieme, tipo o membro. (Anche se in genere si utilizza un livello Assembly[assembly:ObfuscateAssemblyAttribute(true)]


1
Ho indovinato, ma mi sbagliavo. L'attributo Obfuscation è solo un suggerimento per gli obiettori di terze parti. Per impostazione predefinita, il compilatore non oscura nulla.
Dan Fiddling By Firelight,

@DanNeely gratuito per gli utenti di Visual Studio Pro / Ultimate!
Chris S,

4
Se ti riferisci a DotFuscator Community Edition, il livello di protezione fornito è così basso che nella migliore delle ipotesi non conta quasi nulla.
Dan è Fiddling By Firelight il

@ricovox Ho aggiunto un riepilogo
Chris S,

9

Gli attributi che utilizzo di più sono quelli relativi alla serializzazione XML.

XmlRoot

XmlElement

XmlAttribute

eccetera...

Estremamente utile quando si eseguono analisi o serializzazioni XML rapide e sporche.


8

Essere uno sviluppatore di livello intermedio che mi piace

System.ComponentModel.EditorBrowsableAttribute Mi permette di nascondere le proprietà in modo che lo sviluppatore dell'interfaccia utente non sia sopraffatto dalle proprietà che non devono vedere.

System.ComponentModel.BindableAttributeAlcune cose non hanno bisogno di essere databound. Ancora una volta, riduce il lavoro che gli sviluppatori dell'interfaccia utente devono fare.

Mi piace anche il DefaultValue quello menzionato da Lawrence Johnston.

System.ComponentModel.BrowsableAttribute e il Flags sono usati regolarmente.

Io uso System.STAThreadAttribute System.ThreadStaticAttribute quando necessario.

A proposito. I questi sono altrettanto preziosi per tutti gli sviluppatori di framework .Net.


8

[EditorBrowsable(EditorBrowsableState.Never)]consente di nascondere proprietà e metodi da IntelliSense se il progetto non è nella soluzione. Molto utile per nascondere flussi non validi per interfacce fluide. Quanto spesso vuoi GetHashCode () o Equals ()?

Perché MVC [ActionName("Name")]ti consente di avere un'azione Ottieni e Pubblica azione con la stessa firma del metodo o di utilizzare trattini nel nome dell'azione, che altrimenti non sarebbe possibile senza creare un percorso per esso.


8

Ritengo sia importante menzionare qui che anche i seguenti attributi sono molto importanti:

STAThreadAttribute 

Indica che il modello di threading COM per un'applicazione è l'appartamento a thread singolo (STA).

Ad esempio questo attributo viene utilizzato nelle applicazioni Windows Form:

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());
    }
}

E anche ...

SuppressMessageAttribute

Sopprime la segnalazione di una specifica violazione delle regole dello strumento di analisi statica, consentendo più soppressioni su un singolo artefatto di codice.

Per esempio:

[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 viene utilizzato per impedire alla tua applicazione di girare accidentalmente un'altra istanza di se stessa all'avvio?
Luminoso

7

In cima alla mia testa, ecco un breve elenco, approssimativamente ordinato in base alla frequenza d'uso, di attributi predefiniti che effettivamente uso in un grande progetto (~ 500k LoC):

Flag, serializzabili, WebMethod, COMVisible, TypeConverter, Conditional, ThreadStatic, Obsolete, InternVisibleTo, DebuggerStepThrough.


2
+1 per ThreadStatic, sorpreso che nessuno lo abbia menzionato finora, e anche per l'approccio statistico
staafl

6

Genero classe di entità dati tramite CodeSmith e utilizzo gli attributi per alcune routine di convalida. Ecco un esempio:

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

E ho ottenuto una classe di utilità per eseguire la convalida in base agli attributi associati alla classe di entità dati. Ecco il codice:

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] consente azioni di sicurezza per un PermissionSet da applicare al codice usando la sicurezza dichiarativa.

// usage:
public class FullConditionUITypeEditor : UITypeEditor
{
    // The immediate caller is required to have been granted the FullTrust permission.
    [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
    public FullConditionUITypeEditor() { }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.