Frage

Ich habe eine generische Repository<T>-Klasse, die ich mit einer ObjectDataSource verwenden möchte.Repository<T> befindet sich in einem separaten Projekt namens DataAccess.Entsprechend Dieser Beitrag stammt aus den MS-Newsgroups (relevanter Teil unten kopiert):

Innen ruft die ObjectDataSource type.gettype (String) auf, um den Typ zu erhalten. Daher müssen wir die in Type dokumentierte Richtlinie befolgen.Sie können auf die MSDN-Bibliothek unter Type.GetType verweisen:

http://msdn2.microsoft.com/en-us/library/w3f99sx1.aspx

Aus dem Dokument erfahren Sie, dass Sie Back Tick (`) verwenden müssen, um den Typennamen zu bezeichnen, der Generika verwendet.

Außerdem müssen wir hier den Assemblynamen in der Typnamenzeichenfolge angeben.

Die Antwort auf Ihre Frage lautet also, den Typnamen wie folgt zu verwenden:

TypeName="TestObjectDataSourceAssembly.MyDataHandler`1[System.String],TestObjectDataSourceAssembly"

Okay, macht Sinn.Wenn ich es jedoch versuche, löst die Seite eine Ausnahme aus:

<asp:ObjectDataSource ID="MyDataSource" TypeName="MyProject.Repository`1[MyProject.MessageCategory],DataAccess" />

[InvalidOperationException:Der in der TypeName-Eigenschaft von ObjectDataSource „MyDataSource“ angegebene Typ konnte nicht gefunden werden.]

Das Merkwürdige ist, dass dies nur passiert, wenn ich die Seite betrachte.Wenn ich das Dialogfeld „Datenquelle konfigurieren“ im VS2008-Designer öffne, werden mir die Methoden meiner generischen Repository-Klasse ordnungsgemäß angezeigt.Auch die Übergabe der TypeName-Zeichenfolge an Type.GetType() beim Debuggen gibt einen gültigen Typ zurück.Was gibt es also?

War es hilfreich?

Lösung

Machen Sie so etwas.

Type type = typeof(Repository<MessageCategory);
string assemblyQualifiedName = type.AssemblyQualifiedName;

Rufen Sie den Wert von „assemblyQualifiedName“ ab und fügen Sie ihn in das Feld „TypeName“ ein.Beachten Sie, dass Type.GetType(string) der übergebene Wert sein muss

Der durch die Assembly qualifizierte Name des abzurufenden Typs.Sehen AssemblyQualifiedName.Wenn sich der Typ in der aktuell ausgeführten Assembly oder in Mscorlib.dll befindet, reicht es aus, den durch seinen Namespace qualifizierten Typnamen anzugeben.

Es kann also funktionieren, wenn Sie diese Zeichenfolge in Ihrem Code übergeben, da sich diese Klasse in der aktuell ausgeführten Assembly befindet (wo Sie sie aufrufen), während dies bei ObjectDataSource nicht der Fall ist.

Höchstwahrscheinlich ist es der Typ, nach dem Sie suchen

MyProject.Repository`1[MyProject.MessageCategory, DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null], DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null

Andere Tipps

Ich weiß, dass dies ein alter Beitrag ist, aber ich hatte kürzlich selbst dieses Problem.Eine andere Lösung wäre, die Vererbung durch die Objektkomposition zu ersetzen, z.B.

[DataObject]
public class DataAccessObject {
    private Repository<MessageCategory> _repository;

    // ctor omitted for clarity
    // ...

    [DataObjectMethod(DataObjectMethodType.Select)]
    public MessageCategory Get(int key) {
        return _repository.Get(key);
    }
}

Auf diese Weise weiß die ObjectDataSource nichts über das Repository, da es innerhalb der Klasse verborgen ist.Ich habe eine Klassenbibliothek in meiner Fassadenebene, die ein absolut sinnvoller Ort ist, um diesen Code in das Projekt einzufügen, an dem ich arbeite.

Wenn Sie Resharper und Schnittstellen verwenden, ist es außerdem möglich, Resharper dazu zu bringen, das Refactoring mithilfe der Resharper-Funktion „Implementieren mithilfe von Feldern“ durchzuführen.

Darren,

Vielen, vielen Dank für deinen Beitrag.Ich habe den ganzen Tag damit gekämpft.Seltsamerweise muss ich in meinem Fall die eckigen Klammern verdoppeln, z.für deinen Code:

MyProject.Repository`1[[MyProject.MessageCategory, DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null]], DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null

Roger

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top