[ lukeguy @ 29.07.2010. 10:31 ] @
Pravim neku metodu koja prima nekoliko stringova čije vrednosti bi trebalo da budu imena property-ja klase. Da li postoji neki atribut koji proverava da li su ta imena validna, tj. da li property-ji sa takvim imenom postoje?

Npr:
Code:

public class Osoba
{
    public string Ime { get; set; }
    public string Prezime { get; set; }
}

public class NekaKlasa
{
    private static void NekaMetoda(Osoba obj, string propertyName)
    {
        if (obj.GetType().GetProperty(propertyName).GetValue(obj, null) != null)
        {
            //do something
            //...
        }
    }
}


I sad ako pozovem NekaKlasa.NekaMetoda(obj, "Ime") to bi trebalo da prođe, a ako pozovem NekaKlasa.NekaMetoda(obj, "NepostojeciProperty") da dobijem compile time error.
[ Boris B. @ 29.07.2010. 13:18 ] @
Postoje neki atributi koji rade u compile time-u (npr. Obsolete, UsageAttribute, Extension, itd.), ali su svi unapred definisani u kompajleru. Atributi koje ti kao developer pises se kompajliraju u assembly i koriste iskljucivo u run time-u. Uostalom nisam siguran ni kako bi taj sistem radio, sta je sa calculated stringovima, npr. NekaKlasa.NekaMetoda(obj, "Ime" + con.ReadLine())?

Ukratko, compile time gresku neces nikada dobiti na taj nacin, nema tih atributa koji to rade.
Umesto toga koristi named string constants sto ce drasticno olaksati posao i smanjiti mogucnost runtime greske, npr.

Code:

public class Osoba
{
   public const string ImeProperty = "Ime";
   public const string PrezimeProperty = "Ime";
}

...

NekaKlasa.NekaMetoda(obj, Osoba.Ime);
[ lukeguy @ 30.07.2010. 13:06 ] @
Hvala na odgovoru.

Primetio sam da je takvo (ili slično) ponašanje u nekim slučajevima implementirano. Recimo string.Format() me odmah upozorava ako se broj argumenata i parametara ne poklapa ili XML doc mi prijavljuje grešku ako nisam napisao dokumentaciju za sve parametre metode itd. Pa sam se nadao da je to urađeno uz pomoć atributa i da nešto slično već postoji za proveru imena svojstava.