2016-08-25 4 views
0

definiert Ich versuche, eine Container-Klasse zu erben, die Teil einer anderen DLL ist, die die folgende StrukturDer Typ hat keine Konstrukteuren

namespace MySdk 
{ 
    // Summary: 
    //  Container class used to encapsulate individual mark details 
    public class MathsReport: IEnumerable 
    { 
     // Summary: 
     //  A list of mark details. 
     public List<Mark> Marks; 

     // Summary: 
     //  Get access to the C# IEnumerator interface of the mark reports list. 
     // 
     // Returns: 
     //  The IEnumerator interface to the list of mark reports. 
     public IEnumerator GetEnumerator(); 
    } 
} 

My-Code

public class MyReport : MathsReport 
{ 
} 

Es The type MySdk.MathsReport has no constructors defined wirft hat.

Warum es Fehler wirft und mich von inherting einschränkt. Und wie kann ich es überwinden?

+2

Der Code, den Sie wäre gut präsentiert haben, aber vermutlich 'MathsReport' * eigentlich * deklariert einen Konstruktor, aber mit internen/privater Zugang. Ihre Unterklasse müsste Zugriff auf diesen Konstruktor haben, um sie zu verketten. Können Sie den Code in der anderen DLL anschauen und/oder ändern? –

+1

Der Code, der für 'MathsReport' angezeigt wird, sieht einer dekompilierten Version ziemlich ähnlich. Sie sollten prüfen, ob ein Konstruktor vorhanden ist. Wenn dies der Fall ist (was ziemlich sicher ist), hat dieser Zugriffsmodifikator diesen Konstruktor. –

+0

@JonSkeet Danke, wie von @ Lasse V. Karlsen erwähnt, ist es ein dekompilierter Code und der obige Code ist, was ich in der DLL sehe. Es gibt keinen anderen Code in der Klasse MathsReport –

Antwort

0

Um zu wiederholen, was in den Kommentaren gesagt wurde, hat die MathsReport keine öffentlichen Konstruktoren, was bedeutet, dass Sie es effektiv nicht erben können.

Sie können jedoch Erweiterungsmethoden hinzufügen, um verschiedene "Extra" -Dinge auszuführen, ohne die Klasse tatsächlich zu erben. Offensichtlich ist dies nicht dasselbe wie tatsächliche Vererbung, aber es könnte für Ihren Anwendungsfall ausreichen.

Beispiel für eine Erweiterungsklasse:

public static class MathsReportExtensions 
{ 
    public static Mark GetBestMark(this MathsReport mathsReport) 
    { 
    //this is just a sample code which returns the first Mark from the collection 
    return mathsReport.First(); 
    } 
} 

Verbrauch:

using NamespaceToExtensionClass; 

//... 

public void SomeMethodUsingMathsReport(MathsReport mathsReport) 
{ 
    var bestMark = mathsReport.GetBestMark(); 
} 
Verwandte Themen