06. januar 2011 - 23:27Der er
44 kommentarer og 1 løsning
Hente størrelse på en generic T der er et array
Jeg har defineret en generisk metode, der tager et (T t) som parameter. Det går helt fint...og her er ingen problemer...ved debug kan jeg se at t indeholder mit ArrayList med data. Hvordan finder jeg størrelsen på mit array. Jeg har forsøgt med reflection: t.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); og jeg kan se at Count ligger på index[1], men det er jo teksten.
HVordan er det lige man finder størrelsen på mit array?
Men hvis du ved at det er en ArrayList så skal du nok erklære argumentet som ArrayList og så kan du bruge Count property direkte. Eller langt bedre lad det være List<T> !
Hvad er det reelt set du prøvet på? Siden du vil finde størrelse på dit T t ? som du siger er en ArrayList ... hvis du allerede ved det er en ArrayList så er det vel lidt mærkeligt at finde størrelse på det ...
Hvad nu hvis en anden bruger det som en T t der er en integer? eller en SqlConnection ?
Okay Buzzz...alting virker meget mærkeligt for dig...hvad jeg synes er mærkeligt er at du slet ikke har leget med generics...jeg kan ikke vide, hvilken type List<foo1> List<foo2>, jeg får ind. De kommer ind som en parameter på min generiske metode. Jeg skal håndtere dette i min kode...jeg har lavet noget lignende før med succes, men bare ikke med arrays... Finder jeg størrelsen...er jeg ret langt fremme i min kode...
Synes du skal sætte dig ind i generics....Jeg har lavet en constraint på min metode, så den kun kan kaldes med arrays...ellers kommer der en fejl. Desuden hedder metoden også noget med array, så man er selv udenom at smide noget crap ind.
Nej, det virker ikke mærkeligt for mig, men vil bare gerne vide hvad du prøver på, der det virker mytisk i min verden via reflection at skulle kigge efter antal Element i dit Array.
Har jeg skrevet jeg ikke bruger Generics ? :-)
Derfor jeg efterlyser lidt hvad du prøver på.
Hvis du alligevel har en constraint på at det skal være et Array ... eller what ever ... hvad er der så Generic ved det ?
Hvorfor så ikke bruge IList<T> eller List<T> som Arve_v også skriver i starten ?
Men hvis du vil den anden vej: ArrayList t = new ArrayList(); var propertyInfos = t.GetType().GetProperties(); var propertyInfo = propertyInfos.Single(a => a.Name == "Count"); var value = propertyInfo.GetValue(t, null); Console.WriteLine(value);
namespace E { public class Program { public static string VeryBad<T>(T o) { int len = (int)typeof(T).GetProperty("Count").GetValue(o, null); return (string)typeof(T).GetProperty("Item").GetValue(o, new object[] { (len-1)/2}); } public static T Better<T>(List<T> o) { int len = o.Count; return o[(len-1)/2]; } public static void Main(string[] args) { List<string> lst = new List<string>(); lst.Add("A"); lst.Add("BB"); lst.Add("CCC"); Console.WriteLine(VeryBad(lst)); Console.WriteLine(Better(lst)); Console.ReadKey(); } } }
int len = (int)typeof(T).GetProperty("Count").GetValue(o, null);
Var lige præcis det, jeg havde brug for at vide...jeg var der næsten men røg af ved GetValue's anden parameter, som du blot har sat til null...jeg faldt ned ved object[] index...og var ikke sikker, hvad jeg skulle smide med ind her...
Fuld points til dig...tusinde tak. Du forstod mit problem i koden.
Sjovt nok. Jeg får fejl...kan det have noget at gøre med at jeg ikke bruger string eller int...jeg bruger mit eget objekt i en List<Foo>. Jeg får en mismatch mellem typerne.
Sjovt...jeg kan kun få verybad til at virke...jeg må kigge på det...men jeg fik et gennembrug...resten må jeg eftertjekke imorgen...ret sent her i DK og skal på arbejde imorgen.
Send du bare et svar ind. Buzz du kan godt være med, så kan jeg hælde noget over hos dig
namespace E { public class Program { public static string VeryBad<T>(T o) { int len = (int)typeof(T).GetProperty("Count").GetValue(o, null); return (string)typeof(T).GetProperty("Item").GetValue(o, new object[] { (len-1)/2}); } public static T2 PrettyBad<T,T2>(T o) where T : List<T2> { int len = (int)typeof(T).GetProperty("Count").GetValue(o, null); return (T2)typeof(T).GetProperty("Item").GetValue(o, new object[] { (len-1)/2}); } public static T2 AlmostThere<T,T2>(T o) where T : List<T2> { int len = o.Count; return o[(len-1)/2]; } public static T Better<T>(List<T> o) { int len = o.Count; return o[(len-1)/2]; } public static void Main(string[] args) { List<string> lst = new List<string>(); lst.Add("A"); lst.Add("BB"); lst.Add("CCC"); Console.WriteLine(VeryBad(lst)); Console.WriteLine(PrettyBad<List<string>,string>(lst)); Console.WriteLine(AlmostThere<List<string>,string>(lst)); Console.WriteLine(Better(lst)); Console.ReadKey(); } } }
namespace E { public class Program { public static string VeryBad<T>(T o) { int len = (int)typeof(T).GetProperty("Count").GetValue(o, null); return (string)typeof(T).GetProperty("Item").GetValue(o, new object[] { (len-1)/2}); } public static T2 PrettyBad<T,T2>(T o) where T : List<T2> { int len = (int)typeof(T).GetProperty("Count").GetValue(o, null); return (T2)typeof(T).GetProperty("Item").GetValue(o, new object[] { (len-1)/2}); } public static T2 AlmostThere<T,T2>(T o) where T : List<T2> { int len = o.Count; return o[(len-1)/2]; } public static T Better<T>(List<T> o) { int len = o.Count; return o[(len-1)/2]; } public static void Main(string[] args) { List<string> lst = new List<string>(); lst.Add("A"); lst.Add("BB"); lst.Add("CCC"); Console.WriteLine(VeryBad(lst)); Console.WriteLine(PrettyBad<List<string>,string>(lst)); Console.WriteLine(AlmostThere<List<string>,string>(lst)); Console.WriteLine(Better(lst)); List<int> lst2 = new List<int>(); lst2.Add(1); lst2.Add(22); lst2.Add(333); // vil smide en fejl // Console.WriteLine(VeryBad(lst2)); Console.WriteLine(PrettyBad<List<int>,int>(lst2)); Console.WriteLine(AlmostThere<List<int>,int>(lst2)); Console.WriteLine(Better(lst2)); Console.ReadKey(); } } }
Smid bare et svar ind... jeg kigger på det imorgen. kl. er 02 og jeg har vel leget nok med generics...(det er ikke engang arbejde, bare fun med generics) skal på arbejde imorgen...må hellere få mig de 5 timer jeg har tilbage inden jeg skal op igen :S
Nej, ked af det Buzzz...men det blev sent...og jeg ville gerne give points inden jeg gik i seng...jeg skal nok sørge for at du får nogle points næste gang muligheden opstår...hvad den helt sikkert gør...
Bliver brugt mange steder da de henter det fra gravatar ...
Men ja ... har overvejet det, men orker ikke at skifte det ud. Man skal ikke altid se proff ud, så er det nemmere at give folk "wow" effekten, når der rent faktisk kommer noget intelligent u daf mig :-)
Jeg oplever desværre den modsatte effekt...jeg har svært ved at tage vedkommende alvorligt...og det vedkommende siger, bliver desværre farvet af det...desværre ingen wow effekt. Desuden behøver en wow effekt ikke have et billede.
Har du det godt med det...så beholder du bare billedet...men bare et venligt tip...
Desværre andres problem, hvis de bliver farvet af et billede og det er jeg bestemt ikke i tvivl om du gør. Man bare læse dette spørgsmål igennem for at finde de svinere du smider efter mig :-).
Men verden er også lille, og nu er det sket to gange på 3 år.
mvh
Synes godt om
Ny brugerNybegynder
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.