2009-09-01 9 views
1

J'ai une question concernant un paramètre de type générique.Type de paramètre générique

Disons que j'ai les définitions suivantes dans mon modèle de domaine:

abstract class Entity<TId> 
{ 
    public TId Id { get; private set; } 
    /* ... */ 
} 

class Person : Entity<long> 
{ 
    public string Name { get; set; } 
    /* ... */ 
} 

Disons que maintenant, je veux créer une méthode pour afficher les détails d'une personne:

public void Details(long? id) 
{ 
    if (!id.HasValue) { 
     Error(...); 
     return; 
    } 
    var person = PersonRepository.Get(id.Value); 
    ShowPersonDetail(person); 
} 

Allons plus loin et dire que PersonRepository est une spécialisation de Repository, de sorte que sa méthode "Get" est implémentée "automagiquement", pour accepter le bon argument d'id typé fort (i Dans ce cas, un argument long).


Maintenant, disons un jour, je décide que Ids de la personne devrait être Guids. Ce que je veux, c'est pouvoir changer cela UNIQUEMENT dans ma classe Person, et cela changera partout ailleurs automatiquement. Si je le fais, dans le code que j'ai en ce moment, la méthode PersonRepository.Get() n'aura pas besoin d'être éditée, mais ma méthode Details() devra être changée.

Je cherchais quelque chose comme:

Details(Person.IdType id) { /*...*/ } 

Oh, en passant, cette méthode « Détails » sera situé dans un autre ensemble, si cela pourrait changer quoi que ce soit ...

mais fortement -typed et doit accepter les types de valeur ou les types de référence.

Des idées?

Merci!

Répondre

1

Je ne sais pas exactement si c'est ce que vous voulez. Vous pouvez avoir la méthode prendre un Func<Person,T> et avoir infère les types pour vous:

public T Get<T>(Func<Person,T> property) { 
    return property(myPerson); 
} 

et appelez avec:

var id = PersonRepository.Get(p => p.Id); 

Le compilateur est capable de déduire le type de T de l'expression lambda.

+0

Ce n'est pas exactement ça, la partie Repository est ok, sans funcs. Le problème est pour d'autres méthodes, en dehors de la portée de mon modèle de domaine. Je vais essayer quelque chose avec des expressions lambda bien. Merci! –

Questions connexes