Question

J'ai un générique Référentiel<T> la classe que je veux utiliser avec un ObjectDataSource.Référentiel<T> vit dans un projet distinct appelé DataAccess.Selon ce post à partir de la MS des groupes de discussion (la partie pertinente de l'copié ci-dessous):

En interne, l'ObjectDataSource appelle Type.GetType(string) pour obtenir le type, nous avons donc besoin de suivre les directives documentées dans le Type.GetType sur la façon pour obtenir le type de recours aux génériques.Vous pouvez vous référer à la Bibliothèque MSDN sur Type.GetType:

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

À partir du document, vous apprendrez que vous devez utiliser backtick (`) pour indique le nom du type qui est l'utilisation de génériques.

Ici aussi, nous devons spécifier le nom de l'assembly dans le nom de type string.

Donc, pour votre question, la réponse est d'utiliser le type de nom comme suit:

TypeName="TestObjectDataSourceAssembly.MyDataHandler`1[Système.Chaîne],TestObjectDataSourceAssembly"

Ok, fait sens.Quand je l'ai essayer, néanmoins, la page déclenche une exception:

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

[InvalidOperationException:Le type spécifié dans la propriété TypeName de ObjectDataSource 'MyDataSource' n'a pas pu être trouvé.]

La chose curieuse est que cela se produit uniquement quand je suis à l'affichage de la page.Quand j'ai ouvert le "Configurer la Source de Données la boîte de dialogue" à partir de la VS2008 designer, correctement me montre les méthodes sur mon générique Référentiel de la classe.En passant, le Nom du type chaîne de caractères de Type.GetType() lors du débogage renvoie également à un type valide.Donc, ce qui donne?

Était-ce utile?

La solution

Faire quelque chose comme cela.

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

obtenir la valeur de assemblyQualifiedName et le coller dans le Nom du type de champ.À noter que la nature.GetType(string), la valeur indiquée doit être

L'assemblée-nom complet du type à obtenir.Voir AssemblyQualifiedName.Si le type est en cours d'exécution de l'assemblée ou dans Mscorlib.dll il suffit de fournir le nom de type, qualifié par son espace de noms.

Ainsi, il peut fonctionner en passant par la chaîne dans votre code, parce que la classe est en cours d'exécution de l'assemblée (où vous êtes en l'appelant), où, comme l'ObjectDataSource ne l'est pas.

Probablement le type que vous cherchez est

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

Autres conseils

Je sais que c'est un vieux post, mais j'ai récemment eu ce problème moi-même.Une autre solution serait de remplacer l'héritage avec une composition d'objet, par exemple

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

    // ctor omitted for clarity
    // ...

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

De cette façon, l'ObjectDataSource ne sais pas au sujet de dépôt en raison de son cachée à l'intérieur de la classe.J'ai une bibliothèque de classe dans mon façade de la couche qui est parfaitement raisonnable de placer ce code dans le projet que je suis en train de travailler sur.

En outre, si vous utilisez Resharper et des interfaces, il est possible d'obtenir Resharper faire le refactoring en utilisant Resharpers "mettre en Œuvre à l'aide du champ" fonction.

Darren,

Merci beaucoup pour votre post.Je me bats avec cela toute la journée.Bizarrement, dans mon cas, j'ai besoin de double crochets, par exemplepour votre morceau de code:

MyProject.Référentiel`1[[MyProject.MessageCategory, DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null]], DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null

Roger

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top