Avatar billede Keagir Nybegynder
01. april 2010 - 18:13 Der er 30 kommentarer og
1 løsning

Hvordan får man properties ud fra en klasse gennem reflection.

Jeg har en metode som modtager en generic.
public T MinMetode<T>(int id) where T : class, new() {

I min metode laver jeg en typeof(T), hvorefter jeg forsøger at hive properties ud fra den. På nettet har jeg fundet rigtige mange eksempler på, hvordan jeg gør det:

PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public);

...men lige meget hvad, så er mit properties array tomt.

Hvad gør jeg forkert?
Avatar billede Keagir Nybegynder
01. april 2010 - 18:14 #1
Mine properties i min klasse er sat som public..
Avatar billede arne_v Ekspert
01. april 2010 - 18:21 #2
Hvad giver:

PropertyInfo[] properties = typeof(T).GetProperties();

?
Avatar billede Keagir Nybegynder
01. april 2010 - 18:34 #3
Hej Arne_v

Dejligt at se du stadigvæk er her....jeg blev selv nødt til at lave en profil her, da den gamle simpelthen ikke ville virke mere :S

Mit array er bare tomt...kigger man med en watch står der følgende:
{System.Reflection.PropertyInfo[0]}

og den springer derfor min foreach løkke over ->
PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public);
foreach (var property in properties) {
Avatar billede arne_v Ekspert
01. april 2010 - 19:04 #4
Ogsaa tom naar du kalder GetProperties uden argumenter?
Avatar billede arne_v Ekspert
01. april 2010 - 19:04 #5
Indeholder:

typeof(T).FullName

det som du forventer?
Avatar billede Keagir Nybegynder
01. april 2010 - 19:17 #6
Det uden argumenter hjalp...
Jeg havde før forsøgt med GetFields, som krævede BindingFlags argument...da jeg lavede det om til properties, så formodede jeg, at der også var behov for dem...jeg får mine properties fint ud...smid bare et svar ind :D
Avatar billede arne_v Ekspert
01. april 2010 - 19:19 #7
svar
Avatar billede arne_v Ekspert
01. april 2010 - 19:20 #8
Der skal nok bruges en anden kombination af BindingFlags f.eks.:

GetProperties(BindingFlags.Public | BindingFlags.Instance)
Avatar billede Keagir Nybegynder
01. april 2010 - 19:20 #9
inden du smider et svar ind...

Kan man ikke sætte værdien af den property jeg hiver ud til noget?
Fx:
Type mitObj = typeof(T);
int a = 1;
property.SetValue(mitObj, a, null);
Avatar billede arne_v Ekspert
01. april 2010 - 19:22 #10
Jo.

property.SetValue(mitObj, a, null);

er helt fin. HVIS altsaa miObj er det objekt som har den property.

Type mitObj = typeof(T);

laver et Type objekt som ikke har den property.
Avatar billede Keagir Nybegynder
01. april 2010 - 19:24 #11
GetProperties(BindingFlags.Public | BindingFlags.Instance) virker faktisk også...men nu har jeg blot behov for at sætte en værdi ind i en property. Eksemplet ovenover kaster en exception:

System.Reflection.TargetException: Objektet svarer ikke til destinationstypen.
Avatar billede Keagir Nybegynder
01. april 2010 - 19:25 #12
Ok, det burde den være... tjekker lige efter....giver dig point nu...men håber du kan give mig det sidste :)
Avatar billede Keagir Nybegynder
01. april 2010 - 19:26 #13
point givet...
Avatar billede Keagir Nybegynder
01. april 2010 - 19:30 #14
Hvis
Type mitObj = typeof(T);

ikke laver min property har jeg et problem, min formodning var at 'mitObj' havde alle properties som kommer ind igennem T.
Avatar billede arne_v Ekspert
01. april 2010 - 19:30 #15
Har du aendret foerste argument til at vaere det rigtige objekt og ikke det Type objekt?
Avatar billede arne_v Ekspert
01. april 2010 - 19:32 #16
public void foobar(T o) {
    Type o2 = typeof(o);
    // o er af typen T
    // o2 er af type Type
}
Avatar billede Keagir Nybegynder
01. april 2010 - 19:37 #17
Så skulle det være i min metode def, der skal et argument mere ind?

public T MinMetode<T>(int id) where T : class, new() {

Type o = typeof(T);
PropertyInfo[] properties = o.GetProperties(BindingFlags.Public | BindingFlags.Instance);

foreach (var property in properties) {
          switch (property.Name) {
            case "Id":
                property.SetValue(o, id, null);
                break;
...
...
...
          }
  }
}
Avatar billede Keagir Nybegynder
01. april 2010 - 19:38 #18
Min metode skal helst være så generisk så muligt...derfor sender jeg ikke et aktuelt objekt med som argument kun (T)...
Avatar billede arne_v Ekspert
01. april 2010 - 19:45 #19
Proev med:

Type o = typeof(T);
PropertyInfo[] properties = o.GetProperties(BindingFlags.Public | BindingFlags.Instance);

->

T o = new T();
PropertyInfo[] properties = o.GetProperties(BindingFlags.Public | BindingFlags.Instance);
Avatar billede arne_v Ekspert
01. april 2010 - 19:46 #20
Du skal jo have et objekt af type T for at kunne kalde properties for den type.
Avatar billede Keagir Nybegynder
01. april 2010 - 19:46 #21
Det virkede faktisk som du skrev....men jeg måtte ændre signaturen for min metode, og sende en instans af mit egentlige objekt med ned som parameter til metode....havde håber at den generiske (T) kunne være nok for at også kunne danne properties'ne ud fra det.
Avatar billede Keagir Nybegynder
01. april 2010 - 19:50 #22
T o = new T();
PropertyInfo[] properties = o.GetProperties(BindingFlags.Public | BindingFlags.Instance);

GetProperties findes ikke på 'o'
Avatar billede arne_v Ekspert
01. april 2010 - 19:51 #23
T o = new T();
PropertyInfo[] properties = o.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
Avatar billede Keagir Nybegynder
01. april 2010 - 19:54 #24
BINGO

Det var lige det jeg havde brug for :D
Avatar billede Keagir Nybegynder
01. april 2010 - 19:56 #25
Tænkte nok at det burde kunne lade sig gøre uden at sende for mange parametre med ned :)

Tak for hjælpen...

Hed decrypto før....men kan slet ikke logge på med det nick mere....har jeg ikke kunne gøre efter, det nye design her...har flere gange skrevet til eksperten, at jeg bare får en blank side, når jeg logger ind...også når jeg får lavet et nyt password....til sidst lavede jeg bare en ny profil her...
Avatar billede arne_v Ekspert
01. april 2010 - 20:00 #26
ksoeren alias ksoeren2 har vist et tilsvarende problem.

De mergede E brugerdatabasen med CW brugerdatabasen.
Avatar billede Keagir Nybegynder
01. april 2010 - 20:06 #27
Ok, det værster er at jeg har skrevet til dem, for et par uger siden, da jeg til sidst fik spat af det... min email kunne ikke engang genbruges til en ny profil, da den allerede var kendt her.
Har slet ikke fået svar fra dem...til sidst måtte jeg lave en ny mail adresse og en ny profil her...surt at det skulle være så cumbersome...
Avatar billede Keagir Nybegynder
01. april 2010 - 21:19 #28
Jeg har et lille side spørgsmål.
Hvis:
T o = new T(); //Dvs. i dette tilfælde er o = List<MitObj>

Hvordan erklærer jeg så et enkelt item af MitObj udfra de oplysninger, der er tilgængelige her?
Avatar billede arne_v Ekspert
01. april 2010 - 21:27 #29
Det gør du ikke. Du kan lave:

public List<T> MinMetode<T>(int id) where T : class, new() {
    ...
    List<T> lst = new List<T>();
    ...
    T o = new T();
    ...
}
Avatar billede Keagir Nybegynder
01. april 2010 - 21:34 #30
Ahh naturligvis...jeg havde startet op på den måde, men tænkte måske, at jeg kunne nøjes med samme struktur...

Jeg tager den herfra...mange tak for svar.
Avatar billede Keagir Nybegynder
03. april 2010 - 02:20 #31
Forresten fik det til at virke.. :D
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester