18. maj 2005 - 23:53Der er
34 kommentarer og 1 løsning
Dynamisk metodekald
Hej C# eksperter,
Jeg sidder og roder med Reflections og har en spøjs problemstilling. Jeg arbejder med Attributes og Reflection og prøver at gennemløbe alle mine attibutes og derefter kalde en bestemt metode som jeg fisker ud af min attribute
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
hvordan er ListTest erklæret? Og hvor ligger den henne? I samme assembly som den klasse du vil lave din reflection med, eller et andet sted? I hvilket namespace ligger den i?
Jeg er også nysgerrig. I starten nævnes Attributes og derefter bliver der ikke snakket mere om det. I .Net sammenhæng er der et helt specifikt begreb som hedder en "Attribute", men jeg er langt fra sikker på at det er dette som der refereres til her.
Det ville være rart lige at få de grundlæggende begreber på plads først. Så, sammen med cyberfessor, kunne vi ikke se noget mere af din konkrete kode?
[TestFor("Add","Performance")] public TimeSpan testAdd(long iterateNum) {
TimeSpan startTime = (DateTime.Now.TimeOfDay); StringBuilder randomString = new StringBuilder(); Random randomNumber = new Random(); string insertChar; long i = 0; for (i = 0; i < iterateNum; i++) { insertChar = Convert.ToString(Convert.ToInt32(26 * randomNumber.NextDouble()) + 65); new ItuList<string>().Add(insertChar); } TimeSpan endTime = (DateTime.Now.TimeOfDay);
return (endTime - startTime); }
Så vil jeg i min 3. klasse validere deres attributes op mod hinanden:
Type typeFor = typeof(ListTest); TestForAttribute TestForAttr;
// hent alle metoder foreach (MethodInfo methodFor in typeFor.GetMethods()) { // hent alle attributter foreach (Attribute attrFor in methodFor.GetCustomAttributes(true)) { TestForAttr = attrFor as TestForAttribute; if (null != TestForAttr) { if (method.Name == TestForAttr.TargetMethod && TestAttr.TestType == TestForAttr.TestType) {
jeg fik lige en advarsel fra min Visual Studio. Den siger at ikke alle klasser er sat til at køre i debug mode. Kunne det have noget med sagen at gøre?
Det ser helt klart ud til at være et meget interessant projekt du har gang i der. Men kender du NUnit som netop er et framework som er udviklet til den slags testning?
Ja, det gør jeg - det baserer sig dog på JUnit. Formålet med projektet er at bruge Attributes til at bestemme hvilke metoder/klasser der skal testes og hvordan de skal testes f.eks. Performance eller Unit. Derved slipper man for at skulle pålægge testMetoderne navngivningskonventioner, f.eks testforAddPerformance og parse dem. Så i stedet for kan man tilføje en attribut [Test("Add", "Performance")] som gør det meget mere udvidelsesvenligt... tror jeg... det vil vise sig :-)
Udfordringen var godt nok lige vel stor til at jeg med god samvittighed kunne tage den som lidt adspredelse i arbejdet. ;^)
Nedenstående kode er baseret på det kode der postet i denne tråd, samt hvad jeg har kunnet gætte mig frem til ud fra fejlbeskeder. Jeg har også måtte lave visse tilpasninger fordi jeg ikke selv køre med 2.0 endnu.
Random randomNumber = new Random(); for (int i=0; i<iterateNum; i++) { int Res = (new ItuList()).Add(randomNumber.Next(1, 10000), randomNumber.Next(1, 10000)); }
TimeSpan endTime = DateTime.Now.TimeOfDay;
return endTime - startTime; } }
class TestAttribute : Attribute { public readonly string TestType; public readonly string[] Misc;
I NUnit ville samme konstruktion se nogenlunde sådan her ud:
using System; using NUnit.Framework;
namespace DetSomSkalTestes { class ItuList { public int Add(int Tal1, int Tal2) { return Tal1+Tal2; } } }
namespace PocEksperten4 { using DetSomSkalTestes;
[TestFixture] public class ListTest_PerformanceTest { [Test] public void ListTest_Add() { long iterateNum = 100000000;
TimeSpan startTime = DateTime.Now.TimeOfDay;
Random randomNumber = new Random(); for (int i=0; i<iterateNum; i++) { int Res = (new ItuList()).Add(randomNumber.Next(1, 10000), randomNumber.Next(1, 10000)); }
TimeSpan endTime = DateTime.Now.TimeOfDay;
string Performance = string.Format("Performance: {0}", endTime - startTime); Assert.Fail("Dette er ikke en fejl. " + Performance); } }
[TestFixture] public class ListTest_FuctionalityTest { // Funktionalitets test her. } }
Bortset fra at man er nødt til at bruge Assert.Fail til at meddele hvad performance var - af en eller anden grund har NUnut ikke en Assert.Pass eller en Assert.Message - så kan jeg nu ikke se at det skulle være noget specielt besværligt i at gøre det på den måde. Ja, NUnit er starter fra JUnit men det har udviklet sig videre siden da.
Bortset fra det, så er det som sagt et interessant projekt du har gang i. :^)
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.