Laden...

NullReferenz bei GetMethod() bei IISServiceHost.Inlays

Erstellt von fresh4us vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.691 Views
F
fresh4us Themenstarter:in
24 Beiträge seit 2015
vor 8 Jahren
NullReferenz bei GetMethod() bei IISServiceHost.Inlays

hallo,

ich habe hier folgende fehlermeldung: > Fehlermeldung:

Object reference not set to an instance of an object.

was ich hier machen möchte ist es meinen testdruck statt auf einem drucker als gif zu speichern, jedoch habe ich da ein problem mit meinen reflektionen,
ich habe hier mein obj in der variable inlay und hol mir mit gettype() ein objekt welches den typ darstellt.
mit getmethod hol ich mir ein objekt was eine methode darstellt und dann rufe ich mit invoke diese methode auf.
durch mein if frag ich ab ob inlay eine a3 oder a4 seite ist, also ist inlay nicht immer ein objekt der selben klasse..

hab ihr ne idee, wie ich es zum laufen bringe?

 private void CreateInlayImage(int order)
        {
            DataPublication.Orders o = null;
            object inlay = null;
            using (DataPublication.tec_ffEntities entities = new DataPublication.tec_ffEntities())
            {
                 o = entities.Orders.Include("Clients").Where(i => i.id == order).First();
            }

            Image[] inlayArray = null;

            if (o.Clients.clientNumber.Equals("DIN") || o.Clients.clientNumber.Equals("DI2"))
                inlay = new IISServiceHost.Inlays.InlayMcg(order);
            else if (o.Clients.clientNumber.Equals("GOA"))
                inlay = new IISServiceHost.Inlays.InlayGoa(order);
           
            if (o.Clients.clientNumber.Equals("BIRD") || o.Clients.clientNumber.Equals("CAT") || o.Clients.clientNumber.Equals("DOG"))
            {
                Image[] arrInlayPages = null;
                Image[] arrInlayReturns = null;
                Image[] arrInlayLabels = null;

                arrInlayPages = (Image[])inlay.GetType().GetMethod("CreateImageInvoice").Invoke(inlay, new object[] { 825, 1170, false, true });
                arrInlayReturns = (Image[])inlay.GetType().GetMethod("CreateImageReturn").Invoke(inlay, new object[] { 825, 1170, false });
                arrInlayLabels = (Image[])inlay.GetType().GetMethod("CreateImageLabels").Invoke(inlay, new object[] { 585, 825, false });
                inlayArray = arrInlayPages.Concat(arrInlayReturns).Concat(arrInlayLabels).ToArray(); 
            }
            else
            {
                inlayArray = (Image[])inlay.GetType().GetMethod("CreateImage").Invoke(inlay, new object[] { 1170, 1650, false });
            }


            for (int counter = 0; counter < inlayArray.Length; counter++)
            {
                inlayArray[counter].Save("f:\\data\\invoice_" + o.id + "_" + counter + ".gif", System.Drawing.Imaging.ImageFormat.Gif);
            }
        }

        private static bool CertificateValidation(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
            System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
        {
         
            return true;
        }

        private void btnGetCorrectEAN_Click(object sender, EventArgs e)
        {
            lblCorrectEANCodeResult.Text = "";
            txtConvertedEANs.Text = "";

            foreach (string strLine in txtEANCode.Lines)
            {
                if (String.IsNullOrEmpty(strLine.Trim()))
                    continue;

                if (strLine.Trim().Length == 12)
                {
                    txtEANs.Text += strLine + DataPublication.tecFfmService.getEAN12Checksum(strLine.Trim()).ToString() + Environment.NewLine;
                    txtConvertedEANs.Text += tecFfmService.calculateEAN13Barcode(strLine.Trim()) + Environment.NewLine;
                }
                else if (strLine.Trim().Length == 13)
                {
                    txtConvertedEANs.Text += tecFfmService.calculateEAN13Barcode(strLine.Trim()) + Environment.NewLine;
                }
                else
                    lblCorrectEANCodeResult.Text += "Bitte geben Sie nur eine Zeichenlänge von 12 oder 13 Zeichen ein!" + Environment.NewLine;
            }
        }
2.207 Beiträge seit 2011
vor 8 Jahren
F
fresh4us Themenstarter:in
24 Beiträge seit 2015
vor 8 Jahren

wow du antwortest echt schnell oO

arrInlayPages = (Image[])inlay.GetType().GetMethod("CreateImageInvoice").Invoke(inlay, new object[] { 825, 1170, false, true });

getmethod ist null, demzufolge bekomme ich die die werte von CreateImageInvoice, CreateImageReturn, CreateImageLabels nicht

L
95 Beiträge seit 2009
vor 8 Jahren

Und damit hast du dir deine Frage auch selber beantwortet.
Anscheinend hat der Typ hinter dem Objekt inlay keine Methode Namens CreateImageInvoice.

F
fresh4us Themenstarter:in
24 Beiträge seit 2015
vor 8 Jahren

mir stell sich ja die frage, wie ich es beheben kann, denn es funktionierte ja mal oO

189 Beiträge seit 2014
vor 8 Jahren

Nur "Wie mach ich das? Wie löse ich mein Problem?" ist eine so allgemeine Frage, dass hier im Forum dir nur mit [Hinweis] Wie poste ich richtig? geantwortet werden kann.
Deine Aufgabe ist es ein konkretes Problem fest zu stellen und dann hier - falls du nicht weiter kommst - konkret eine Frage zu stellen.
"Mein Auto ist kaputt, mach mal ganz!" kannst du in der Autowerkstatt bringen. Nur wenn du selbst der Automachaniker bist, kommt das blöd ... . 😉

F
fresh4us Themenstarter:in
24 Beiträge seit 2015
vor 8 Jahren

das ist ja so nicht ganz richtig, ich weiß wo die fehler liegen, nur habe ich noch keinen lösungsweg erdacht, warum getmethod die werte nicht mehr übertragen bekommt, und wo ich das objekt nun instanzieren muss,

189 Beiträge seit 2014
vor 8 Jahren

Du weißt doch noch garnicht wo wirklich dein Fehler liegt! - oder erzählst du uns nur die Hälfte?!
Oder kannst du sagen, WARUM du NULL bekommst?

denn es funktionierte ja mal

Kannst du vielleicht dann auch verraten, was du geändert hast oder anders machst?

L
95 Beiträge seit 2009
vor 8 Jahren

Auch das kannst du mit dem Debugger herausfinden.
Schau dir inylay bzw. den Rückgabewert von inlay.GetType() an und schau ob es dort eine passende Methode gibt.

F
fresh4us Themenstarter:in
24 Beiträge seit 2015
vor 8 Jahren

ein kollege der im urlaub ist änderte etwas, und das ist ja auch nur eine testfunktion,

der debugger sagt mir das ich null erhalte wenn ich die methode ausführe, weil es CreateImageInvoice nicht gibt, wo also lege ich diese nun an?

771 Beiträge seit 2009
vor 8 Jahren

Warum überhaupt verwendest du hier Reflection?
InlayMcg und InlayGoa werden ja wohl hoffentlich eine gemeinsame Basisklasse oder Interface haben, so daß du diese direkt aufrufen kannst?!

Auch der restliche Code ist sehr anfängerhaft, z.B. wird strLine.Trim() in der unteren Methode x-mal aufgerufen.
Und .Equals("..") sieht mir auch sehr nach Java aus -> in C# kann man einfach == verwenden!

2.207 Beiträge seit 2011
vor 8 Jahren

Und .Equals("..") sieht mir auch sehr nach Java aus -> in C# kann man einfach == verwenden!

In dem Fall schon. Aber nicht generell. Da bitte ein wenig aufpassen. Referenz/Wertevergleich

2.080 Beiträge seit 2012
vor 8 Jahren

Es gibt noch einen zweiten Parameter, wo Du BindingFlags angeben kannst.
Dort kannst Du allgemeine Informationen angeben, wie der Member gesucht werden soll. So musst Du dort z.B. NonPublic und Instance angeben, wenn Du einen private/protected/internal Instanz-Member finden willst.
Wenn Du alles finden willst, musst Du glaube ich Public, NonPublic, Instance und Static angeben.

Wenn Du so nicht's findest, gibt es die Methode nicht (mehr).
Es kann immer noch sein, dass eine Änderung in der Library schuld ist.
Wenn ein Interface-Member explizit omplementiert ist, findest Du den glaube nicht nicht direkt über GetMethod, Du müsstest dann das Interface nehmen - fest nageln lassen will ich mich darauf aber nicht 😄
Ansonsten bleibt nur noch, dass der Member wirklich fehlt, dann musst Du selber heraus finden, wie Du die gleiche Funktionalität erreichst.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.