Domanda

Ho una classe Repository<T> generica che desidero utilizzare con un ObjectDataSource.Il repository<T> risiede in un progetto separato chiamato DataAccess.Secondo questo post dai newsgroup MS (parte pertinente copiata di seguito):

Internamente, ObjectDataSource chiama type.getType (stringa) per ottenere il tipo, quindi dobbiamo seguire le linee guida documentate in type.getType su come ottenere il tipo usando generici.È possibile fare riferimento a MSDN Library su Type.GetType:

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

Dal documento, imparerai che devi usare Backtick (`) per indicare il nome di tipo che utilizza generici.

Inoltre, qui dobbiamo specificare il nome dell'assembly nella stringa del nome del tipo.

Quindi, per la tua domanda, la risposta è utilizzare il nome del tipo come segue:

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

Ok, ha senso.Quando lo provo, tuttavia, la pagina genera un'eccezione:

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

[InvalidOperationException:Impossibile trovare il tipo specificato nella proprietà TypeName di ObjectDataSource 'MyDataSource'.]

La cosa curiosa è che questo accade solo quando sto visualizzando la pagina.Quando apro la finestra di dialogo "Configura origine dati" dal designer VS2008, mi mostra correttamente i metodi sulla mia classe Repository generica.Anche il passaggio della stringa TypeName a Type.GetType() durante il debug restituisce un tipo valido.Allora cosa dà?

È stato utile?

Soluzione

Fai qualcosa del genere.

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

ottenere il valore di assemblyQualifiedName e incollarlo nel campo TypeName.Tieni presente che Type.GetType(string), il valore passato deve essere

Nome completo dell'assembly del tipo da ottenere.Vedere NomeQualificatoAssemblea.Se il tipo si trova nell'assembly attualmente in esecuzione o in Mscorlib.dll, è sufficiente fornire il nome del tipo qualificato dal relativo spazio dei nomi.

Quindi, potrebbe funzionare passando quella stringa nel tuo codice, perché quella classe si trova nell'assembly attualmente in esecuzione (dove la stai chiamando), mentre ObjectDataSource non lo è.

Molto probabilmente il tipo che stai cercando lo è

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

Altri suggerimenti

So che questo è un vecchio post ma recentemente ho avuto anch'io questo problema.Un'altra soluzione sarebbe quella di sostituire l'ereditarietà con la composizione dell'oggetto, ad es.

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

    // ctor omitted for clarity
    // ...

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

In questo modo ObjectDataSource non è a conoscenza del repository perché è nascosto all'interno della classe.Ho una libreria di classi nel mio livello di facciata che è un posto perfettamente ragionevole per inserire questo codice nel progetto su cui sto lavorando.

Inoltre, se si utilizzano Resharper e le interfacce, è possibile fare in modo che Resharper esegua il refactoring utilizzando la funzione "Implement using field" di Resharper.

Darren,

Molte, molte grazie per il tuo post.È tutto il giorno che combatto con questa cosa.Stranamente, nel mio caso, devo raddoppiare le parentesi quadre, ad es.per il tuo pezzo di codice:

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

Ruggero

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top