[ S A J A @ 31.05.2015. 13:04 ] @
Imam neku klasu koja ima propertise:

Code:

Class ImeKlase
        <DisplayName("Artikal šifra")> Property ArtikalSifra As Integer
        <DisplayName("Artikal naziv")> Property ArtikalNaziv As String
End Class


Ovaj atribut DisplayName mi koristi da zavežem PropertyGrid za objekat i da se ta imena vide. To lepo radi.

Sad mi taj DisplayName treba i na drugim mestima, to može da se izvadi preko:

Code:
Dim attrs() As Object = ImeKlase.GetType.GetProperty("ArtikalNaziv").GetCustomAttributes(GetType(DisplayNameAttribute), False)
DirectCast(attrs(0), DisplayNameAttribute).DisplayName


Na taj način mogu da dobijem DisplayName od određenog propertisa.

E sad bi ja dodatno da zakomplikujem pa da napravim ekstenziju na propertis kako bi dobio DisplayName prostim kucanjem

Code:
ImeKlase.ArtikalNaziv.DisplayName


I upravo tu imam problem... ako napravim ekstenziju na klasu onda se ekstenzija vidi na klasi a ne na propertisima klase:

Code:
<System.Runtime.CompilerServices.Extension> _
Public Function DisplayName(s As ImeKlase) As String
    nešto...
End Function


Dakle pitanje je: kako da napravim ekstenziju baš na propertis klase?




[ dusans @ 31.05.2015. 13:14 ] @
Ekstenzije propertija ne postoje...
Možeš da napraviš ekstenziju na tvoju klasu ili object
ali nećeš moći da pišeš onako kako si zamislio već
Instanca.DisplayName("ArtikalNaziv")
[ Shadowed @ 31.05.2015. 14:04 ] @
Kao sto dusans rece, to ne moze. Razlog je sto kad od ovog tvog "ImeKlase.ArtikalNaziv.DisplayName" uradis "ImeKlase.ArtikalNaziv" tebi to daje vrednost property-a pa je onaj ".DisplayName" na toj vrednosti.
Mozes uraditi sa dodavanjem DisplayName metoda u svoju klasu (ili baznu klasu iz koje ce sve u kojoj je to potrebno nasledjivati) gde ces kao string proslediti ime property-a. To je ovo poslednje sto je dusans napisao.

To mozes poboljsati, da ne bi imao greske u stringovima (a i zbog intellisense-a) tako sto ces metod napraviti tako da prihvata lambda expression a ne string.
Ne znam napamet da ti iskucam ali pronadji na netu implementaciju za INotifyPropertyChanged koja koristi lambda expression (ne moz' da omasis). To je skroz druga stvar ali mozes da iskorists deo koda koji od lambde dobija property name kao string.
[ S A J A @ 31.05.2015. 16:12 ] @
Kako ja baš uvek da naletim na nešto što nema, a treba mi...

Vidim i drugi se muče sa sličnim problemima, ovde čak ima i nekih odgovora ali je previše napredno za mene da bi skapirao da li postoji rešenje:
http://stackoverflow.com/quest...property-in-strongly-typed-way

[ Shadowed @ 31.05.2015. 20:27 ] @
To sto su oni dali na linku je vrlo slicno ovom sto sam ja predlozio.
ViIdecu malo kasnije da ti uradim, al' u C#-u (nisam sa vb-om radio.. ne znam ni sam) pa ti prepevaj :)
[ Shadowed @ 31.05.2015. 22:56 ] @
U stvari, nema sta da pravim :)
Onaj prvi kod u prvom odgovoru ti je to sto ti treba. Preneseno odande:

Code (csharp):

public static string GetDisplayName<TModel, TProperty>(this TModel model, Expression<Func<TModel, TProperty>> expression) {

    Type type = typeof(TModel);

    MemberExpression memberExpression = (MemberExpression)expression.Body;
    string propertyName = ((memberExpression.Member is PropertyInfo) ? memberExpression.Member.Name : null);

    // First look into attributes on a type and it's parents
    DisplayAttribute attr;
    attr = (DisplayAttribute)type.GetProperty(propertyName).GetCustomAttributes(typeof(DisplayAttribute), true).SingleOrDefault();

    // Look for [MetadataType] attribute in type hierarchy
    // http://stackoverflow.com/quest...pplied-with-metadatatype-class
    if (attr == null) {
        MetadataTypeAttribute metadataType = (MetadataTypeAttribute)type.GetCustomAttributes(typeof(MetadataTypeAttribute), true).FirstOrDefault();
        if (metadataType != null) {
            var property = metadataType.MetadataClassType.GetProperty(propertyName);
            if (property != null) {
                attr = (DisplayAttribute)property.GetCustomAttributes(typeof(DisplayNameAttribute), true).SingleOrDefault();
            }
        }
    }
    return (attr != null) ? attr.Name : String.Empty;
}


Kad to imas, onda jednostavno bilo kojoj instanci kazes .GetDisplayName(x => x.ImePropertya). Maltene je iste duzine kao i ono sto si ti hteo, samo je drugaciji redosled pisanja.