2010-03-08 5 views
2

Je pourrais utiliser de très bons liens qui expliquent les Génériques et comment les utiliser. Mais j'ai aussi une question très spécifique, relater à travailler sur un projet en cours.Besoin d'aide pour comprendre Génériques, Comment Types Abstrait Question

Compte tenu de ce constructeur de classe:

public class SecuredDomainViewModel<TDomainContext, TEntity> : DomainViewModel<TDomainContext, TEntity> 
     where TDomainContext : DomainContext, new() 
     where TEntity : Entity, new() 

    public SecuredDomainViewModel(TDomainContext domainContext, ProtectedItem protectedItem) 
      : base(domainContext) 
     { 
      this.protectedItem = protectedItem; 
     } 

Et sa création ainsi:

   DomainViewModel d; 
       d = new SecuredDomainViewModel<MyContext, MyEntityType>(this.context, selectedProtectedItem); 

En supposant que j'ai 20 EntityTypes différents au sein MyContext, est-il plus facile de appeler le constructeur sans un grand changer d'instruction?

De plus, puisque d est DomainViewModel et j'ai besoin plus tard pour accéder à des méthodes de SecuredDomainViewModel, il semble que je dois faire ceci:

if (((SecuredDomainViewModel<MyContext, MyEntityType>)d).CanEditEntity) 

Mais encore une fois « MyEntityType » pourrait en fait être l'un des 20 types diffent. Est-il possible d'écrire ces types d'instructions où MyEntityType est renvoyé à partir d'une sorte de réflexion?

Informations supplémentaires pour la clarification: Je vais enquêter sur ConstructorInfo, mais je pense que j'ai peut-être mal décrit ce que je cherche à faire.

Supposons que j'ai le DomainViewModel, d dans mon message d'origine.

Cela peut avoir été construit par trois voies possibles:

d = new SecuredDomainViewModel<MyContext, Order>(this.context, selectedProtectedItem); 

d = new SecuredDomainViewModel<MyContext, Invoice>(this.context, selectedProtectedItem); 

d = new SecuredDomainViewModel<MyContext, Consumer>(this.context, selectedProtectedItem); 

plus tard, je dois accéder à des méthodes sur le SecuredDomainViewModel, qui doit actuellement être appelé de cette façon:

ex: if (((SecuredDomainViewModel<MyContext, Order)d).CanEditEntity) 
ex: if (((SecuredDomainViewModel<MyContext, Invoice)d).CanEditEntity) 
ex: if (((SecuredDomainViewModel<MyContext, Consumer)d).CanEditEntity) 

En supposant que je N + types entité dans ce contexte, ce que j'espérais pouvoir faire est quelque chose comme ça avec un seul appel:

ex: if (((SecuredDomainViewModel<MyContext, CurrentEntityType)d).CanEditEntity) 

Où CurrentEntityType était une sorte de fonction ou un autre type d'appel renvoyant Order, Invoice ou Consumer en fonction du type d'entité de l'élément en cours.

Est-ce possible?

+0

Pourriez-vous expliquer ce que vous essayez de faire? Je ne suis pas en train de gâcher le point de cette question. – jfar

+0

Fondamentalement, je voudrais être en mesure de dom quelque chose comme ça, mais je sais que cette façon spécifique n'est pas possible: Type entityType; entityType = "Commandes" if (((SecuredDomainViewModel ) d) .CanEditEntity) – kmacmahon

Répondre

1

Vous pouvez créer une interface non-générique qui a la propriété CanEditEntity sur elle, faire SecuredDomainViewModel héritera ce, puis d'appeler la propriété grâce à l'interface ...

En outre, le nouveau constructeur() vous permet de appeler un constructeur sur un type générique qui n'a pas d'arguments (vous pouvez simplement écrire new TEntity()), mais si vous voulez appeler un constructeur qui a des paramètres d'un tour à portée de main, je l'utilise est de passer en tant que délégué:

public void Method<T>(Func<string, bool, T> ctor) { 
    // ... 
    T newobj = ctor("foo", true); 
    // ... 
} 

//called later... 
Method((s, b) => new MyClass(s, b)); 
+1

Nous avons décidé de refactoriser la classe pour utiliser exposer une interface. – kmacmahon

-2

Je ne peux pas aider sur les liens, et probablement pas sur le type non plus.

Constructor

Si vous avez le type, vous pouvez obtenir le constructeur:

ConstructorInfo construtor = typeof(MyEntityType).GetConstructor(new object[]{TDomainContext, ProtectedItem}); 

type

Je ne suis pas vraiment sûr de ce que vous cherchez, mais je ne peux voir quelque chose comme

if (((SecuredDomainViewModel<MyContext, entityType>)d).CanEditEntity) 
{ 
    entityType=typeof(Orders) 
} 

être ce que vous voulez.

+0

J'ai ajouté plus d'informations pour clarifier ce que j'essaie de faire. – kmacmahon

+0

Ce n'était clairement rien de ce que vous cherchiez, mes excuses. Votre approche de l'extension d'une interface semble solide et sensible. (Uhm, je suppose que vous avez la méthode de l'interface générique de travail? Demander de l'aide à ce sujet, sinon.) – ANeves

+0

Yup, nous avons fait! Merci beaucoup d'avoir pris le temps d'examiner cette question. -K – kmacmahon