Avatar billede CodingJoe Nybegynder
05. december 2011 - 21:54 Der er 30 kommentarer og
1 løsning

Reflection - vil gerne fange nanvnet på typen i List<MitNavn>

List<MitNamespace.Shared.Entities.MinKlasse>

Giver:
System.Collections.Generic.List`1[[MitNamespace.Shared.Entities.MinKlasse, MitNamespace.Shared.Entities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]

Hvordan er det lige, jeg kan hive navnet "MinKlasse" ud på en List`1 type?

Jeg kan kun hive ovenstående ud, men synes det er ret grimt at skrive noget regexp, der hiver "MinKlasse" ud. Findes der ikke en property, der kan give mig navnet? Det er fordi, det er alle mine List´1, jeg hiver ud og skal bruge, navnet på typen, man laver en liste på.
Avatar billede arne_v Ekspert
05. december 2011 - 22:01 #1
Type har en GetGenericArguments metode
Avatar billede CodingJoe Nybegynder
05. december 2011 - 22:03 #2
Hmmm jeg opererer med PropertyInfo...prøver lige at kigge under Type
Avatar billede CodingJoe Nybegynder
05. december 2011 - 22:11 #3
Kan ikke rigtig finde GetGenericArguments under min Type.
Avatar billede CodingJoe Nybegynder
05. december 2011 - 22:16 #4
Hvis det kan lade sig gøre i PropertyInfo, så ville jeg blive ret lykkelig...
Avatar billede Syska Mester
05. december 2011 - 22:17 #5
this.GetType().GetGenericArguments()
Avatar billede Syska Mester
05. december 2011 - 22:18 #6
this.GetType().GetProperty("Prop").ReflectedType.GetGenericArguments()
Avatar billede CodingJoe Nybegynder
05. december 2011 - 22:27 #7
foreach (var pi in p.PropertyInfos) {
  if (Equals(pi.PropertyType.Name, "List`1")) {
      var test = pi.GetType().GetProperty(pi.Name).ReflectedType.GetGenericArguments();
    }
}

NullReference exception :(
Avatar billede Syska Mester
05. december 2011 - 22:33 #8
Et gæt ...
var test = pi.GetType().GetProperty(pi.Name).ReflectedType.GetGenericArguments();

til

var test = pi.ReflectedType.GetGenericArguments();
Avatar billede Syska Mester
05. december 2011 - 22:34 #9
Det du prøvede på lige nu var at hente en property på din property som nok ikke findes.
Avatar billede CodingJoe Nybegynder
05. december 2011 - 22:36 #10
Den findes...
Avatar billede CodingJoe Nybegynder
05. december 2011 - 22:38 #11
Hmmm vent...tror jeg, forstår hvad du sagde...prøver med navnet på klassen.
Avatar billede CodingJoe Nybegynder
05. december 2011 - 22:38 #12
Det samme :(
Avatar billede CodingJoe Nybegynder
05. december 2011 - 22:43 #13
var test = pi.ReflectedType.GetGenericArguments();

test giver {System.Type[0]}
Avatar billede CodingJoe Nybegynder
05. december 2011 - 22:54 #14
Det bliver vist noget grimt regexp, jeg skal ud i :S
Avatar billede Syska Mester
05. december 2011 - 22:56 #15
Kan du ikke poste noget mere kode, så vi nemmere kan gennemskue hvad du gerne vil. Deraf kan vi lave noget som virker.

Regex er at give op. Det skal kunne lade sig gøre.
Avatar billede CodingJoe Nybegynder
05. december 2011 - 23:00 #16
var allTypes = new List<Type>();
Assembly assemblies = Assembly.LoadFrom(dllName);
allTypes = assemblies.GetTypes().ToList();

var propertyInfos = allTypes .Select(f => f.GetProperties()).ToList();

foreach (var p in propertyInfos) {
  foreach (var pi in p.PropertyInfos) {
        if (Equals(pi.PropertyType.Name, "List`1")) {
            var test = pi.PropertyType.GetNestedTypes();
        }
  }
}
Avatar billede CodingJoe Nybegynder
05. december 2011 - 23:02 #17
foreach (var pi in p.PropertyInfos) skal rettes til
foreach (var pi in p)
Avatar billede CodingJoe Nybegynder
05. december 2011 - 23:05 #18
og sæt
var test = pi.PropertyType;

Så kan du se, hvad jeg får ud...

Du skal dog have en dll sti (dllName).
Avatar billede arne_v Ekspert
05. december 2011 - 23:07 #19
Proev og kig paa det her eksempel:

using System;
using System.Collections.Generic;
using System.Reflection;

namespace E
{
    public class Data
    {
        public int I { get; set; }
        public string S { get; set; }
        public List<int> IL { get; set; }
        public List<string> SL { get; set; }
    }
    public class Program
    {
        public static void Dump(object o)
        {
            foreach(PropertyInfo pi in o.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                Console.WriteLine(pi.Name);
                if(pi.PropertyType.IsGenericType)
                {
                    Console.WriteLine(pi.PropertyType.GetGenericTypeDefinition().FullName);
                    foreach(Type t in pi.PropertyType.GetGenericArguments())
                    {
                        Console.WriteLine("  " + t.FullName);
                    }
                }
                else
                {
                    Console.WriteLine(pi.PropertyType.FullName);
                }
            }
        }
        public static void Main(string[] args)
        {
            Dump(new Data());
            Console.ReadKey();
        }
    }
}
Avatar billede Syska Mester
05. december 2011 - 23:09 #20
Ret lige alle ting ...

Men hvad er formålet med overstående?

Virker som om du vil finde alle properties som bruger List<T>? Korrekt forstået?
Avatar billede CodingJoe Nybegynder
05. december 2011 - 23:16 #21
Ja...grunden til det skal rettes...er for det kan kompilere og give dig, det jeg ser...ellers skulle jeg sende, dig alt i en side...

Arnes eksempel virker fint, og jeg har lige testet det med en af mine egne typer. Tror jeg vil hente inspiration fra Arne.

Tror ikke jeg er så langt væk, men i det mindste har jeg et eksempel, der virker fint.

Det er blot lidt leg med reflection, så meget af det giver nok ikke mening.

Tak for hjælpen alle. Arne du kan godt smide et svar ind :)
Avatar billede Syska Mester
05. december 2011 - 23:35 #22
Det var mere ment som at du skulle poste det hele igen, i stedet for at jeg skal rette en linje her og der.

Reflection er fint nok, når det giver mening og sjovt nok at vide hvad man kan med det. Du har efterhånden også et par sprøgsmål herinde omkring det :-).

"dynamic" kan varmt anbetales da det kan løse mange af de ting man oftest gjorde med Reflection før.

mvh
Avatar billede CodingJoe Nybegynder
05. december 2011 - 23:42 #23
Sidder på en 3,5 stadigvæk...

dynamic er vist en 4.0

men tak for input...det er guld værd.
Avatar billede Syska Mester
06. december 2011 - 00:18 #24
Hehe, ja, så er der ikke så meget at gøre.
Avatar billede arne_v Ekspert
06. december 2011 - 01:41 #25
svar
Avatar billede arne_v Ekspert
06. december 2011 - 01:42 #26
Jeg ville ioevrigt nok lave:

if (Equals(pi.PropertyType.Name, "List`1")) {

som:

if (pi.PropertyType is List) {
Avatar billede johny Nybegynder
06. december 2011 - 08:40 #27
@CodingJoe: Jeg ville også, som Arne nævner ovenfor, også begrænse mængden af strings, fordi det er meget begrænset hvor meget de skal bruges, da de blot introducerer usikkerheder i din kode, fordi ToString f.eks. kunne blive ændret. Ovenstående ville jeg nok rette til:

if(pi.PropertyType.IsGenericType
        && pi.PropertyType.GetGenericTypeDefinition().Equals(typeof(System.Collections.Generic.List<>))

Ovenstående tester dog kun for om det er af type List<>, men ikke om det er en nedarvning deraf, men det er jo så det næste du kan lege med om du vil håndtere. ;)
Avatar billede CodingJoe Nybegynder
06. december 2011 - 09:00 #28
Tak for alle input.

Arne...når jeg bruger dit eksempel, hvor jeg indlæser en assembly ind istedet, så får jeg desværre ingen hits :/

var assembly = Assembly.LoadFrom(dllName);
Avatar billede arne_v Ekspert
06. december 2011 - 14:54 #29
for(Type t in assembly.GetTypes())
{
            foreach(PropertyInfo pi in t).GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                          ....
            }

}
Avatar billede CodingJoe Nybegynder
06. december 2011 - 17:09 #30
Jeg fik det til at virke alligevel. Ved ikke lige hvorfor min GetGenericArguments()altid var null derhjemme.

Det virker fint  :D

Mange tak
Avatar billede Syska Mester
06. december 2011 - 17:16 #31
Der kan være omkring 2000 grunde til at den er null.

Dog tvivler på samme kode giver null != hjemme og null hjemme.

Kan du ikke teste igen så vi kan udelukke bruger fejl? Lyder i hvert fald mærkeligt at det skulle opføre sig på andre måder.
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