Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Ekstenzije na propertise klase

[es] :: .NET :: Ekstenzije na propertise klase

[ Pregleda: 2401 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

S A J A
Beograd

Član broj: 226539
Poruke: 1907
*.static.sbb.rs.



+421 Profil

icon Ekstenzije na propertise klase31.05.2015. u 13:04 - pre 108 meseci
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?




 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
*.dynamic.sbb.rs.



+311 Profil

icon Re: Ekstenzije na propertise klase31.05.2015. u 13:14 - pre 108 meseci
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")
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12848



+4784 Profil

icon Re: Ekstenzije na propertise klase31.05.2015. u 14:04 - pre 108 meseci
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.
 
Odgovor na temu

S A J A
Beograd

Član broj: 226539
Poruke: 1907
*.static.sbb.rs.



+421 Profil

icon Re: Ekstenzije na propertise klase31.05.2015. u 16:12 - pre 108 meseci
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

 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12848



+4784 Profil

icon Re: Ekstenzije na propertise klase31.05.2015. u 20:27 - pre 108 meseci
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 :)
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12848



+4784 Profil

icon Re: Ekstenzije na propertise klase31.05.2015. u 22:56 - pre 108 meseci
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.
 
Odgovor na temu

[es] :: .NET :: Ekstenzije na propertise klase

[ Pregleda: 2401 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.