2010-01-21 4 views
1

J'ai une hiérarchie de classes où IObject est la classe de base pour le produit et le client. Je veux définir une page de base dans asp.net qui devrait contenir du code générique. La page générique affiche le nom de l'objet et permet à l'utilisateur de supprimer l'objet en demandant une confirmation. La page doit être écrite par rapport au type IObject. Je suis en train de définir une page de base d'une manière ci-dessous, mais il donne une erreur de compilation:Créer une page Web de base paramétrée dans asp.net

public class BaseDeletePage<T> : System.Web.UI.Page 
    where T:IObject 
{ 
} 

Il donne l'erreur de compilation suivante: « Assurez-vous que la classe définie dans ce fichier de code correspond à la ' hérite de l'attribut et étend la classe de base correcte (par exemple Page ou UserControl) "

L'énoncé de problème générique est: Comment définir une classe de pages Web paramétrée, qui pourrait être utilisée par d'autres pages comme classe de base.

Répondre

3

Étant donné que vous avez déjà une interface IObject^définie pour les produits et les clients, je vous recommande de la transmettre simplement via une propriété, au lieu de donner un paramètre de type à la classe.

Donc ce serait:

public class BaseDeletePage : Page { 
    public IObject ObjectToBeDeleted { get; set; } 
} 

^Et puis-je suggérer un nom d'interface différente? IObject est un peu trompeur.

[modifier] Ce que Joel Coehoorn a écrit est correct. Le problème de base est que vous ne pouvez pas instancier une BaseDeletePage, car elle ne sait pas ce qu'est T. Ma réponse ici est que vous n'avez pas du tout besoin d'un paramètre de type. Vous avez simplement besoin d'une classe de base qui peut gérer quelque chose en lui donnant une référence à l'objet à supprimer, et cela peut être fait via une propriété.

+0

J'ai un scénario complètement différent dans mon produit. J'ai rapidement trouvé un exemple à mettre sur un forum. Je vais sûrement évaluer votre suggestion et voir si cela résout mon problème. –

+0

Je ne suis pas entièrement d'accord avec vous. La solution basée sur la propriété ne remplace pas une solution générique. Cela signifie-t-il que nous n'avons jamais besoin d'une classe de base paramétrée. –

+0

En fin de compte, une classe qui hérite de Page ne devrait pas avoir besoin d'un paramètre de type. Il y a très probablement une meilleure façon de faire ce que vous voulez faire. Dans l'exemple que vous avez donné, vous aviez besoin de la page pour pouvoir passer un objet qui implémente IObject afin de le supprimer (je pense, IObject.Delete()). Dans ce cas, vous n'avez pas besoin de savoir s'il s'agit d'un client ou d'un produit, il suffit d'implémenter IObject. Ainsi, vous n'avez pas besoin d'un paramètre de type, vous avez besoin d'une propriété ou d'une méthode pouvant recevoir un objet IObject. Peut-être avez-vous besoin d'une meilleure question? –

0

Je suppose que vous avez un fichier ASPX mappé à cette page de base? Quelque chose ne va pas dans votre déclaration d'héritage.

<%@ Page Inherits="BaseDelegatePage<IObject>" %> 
+0

L'attribut inherit de la balise de page est en cours de réclamation. Cela ne fonctionne pas. –

+0

Quelle est l'erreur? –

1

Vous pouvez construire des classes génériques de page de base avec asp.net, mais vous ne pouvez pas les instancier directement. Vous devez leur donner un type spécifique (spécialisé). Le code que vous avez publié est donc légal, mais vous ne pouvez pas vous connecter directement à un fichier aspx de la manière habituelle. Pour l'utiliser, ce que je normalement faire est quelque chose comme ceci:

public class MyDeletePage : BaseDeletePage<IObject> 
{ 
} 

Rappelez-vous, une page asp.net est réalisée par la création d'instances de votre classe. Tout comme vous ne pouvez pas créer une instance d'un List<T> sans dire au compilateur ce qu'est "T", vous ne pouvez pas utiliser votre page asp.net générique avant d'avoir dit au compilateur (et pas seulement à l'exécution) quel sera votre type spécialisé. être pour cette page.

+0

Je comprends cela. Mais avant cela, j'ai besoin de créer la classe BaseDeletePage . Ce n'est même pas compiler. –

+0

il ne compile pas parce que vous avez une page de balisage aspx quelque part qui essaie d'utiliser votre BaseDeletePage directement. –

+0

Joel, Ne vous trompez pas. Pourriez-vous s'il vous plaît essayer pour moi. Ce serait d'une grande aide. –

Questions connexes