2010-06-05 4 views
4

J'ai une question sur les génériques .net. Considérez le code suivant:Utilisation d'un type générique à partir d'un autre paramètre générique

public abstract class Test<TKey> 
{ 
    TKey Key { get; set; } 
} 

public class Wrapper<TValue, TKey> 
    where TValue : Test<TKey> 
{ 
    public TValue Value { get; set; } 
} 

Maintenant, lorsque vous utilisez ce code, je pourrais faire quelque chose comme ceci:

Wrapper<Test<int>, int> wrapper = new Wrapper<Test<int>, int>(); 

Le paramètre de type int doit être fourni deux fois. Est-il possible de modifier la définition de Wrapper, d'exiger que TValue soit un type générique, et d'utiliser ce paramètre de type générique 'imbriqué' du paramètre de type TKey?

+0

peut '' test pourrait être '' SomethingInheritingFromTest à la place? Si c'est le cas je ne vois pas comment contourner le paramètre type, puisque vous n'avez pas de type, vous pouvez utiliser le même 'T', puisque vous ne savez pas ce que c'est, même si vous avez créé un base/wrapper ... gars génériques plus intelligents ici que moi, j'espère que quelqu'un m'éduque :) –

Répondre

1

Je dirais que cela dépend si comme TValue spécifique où TValue dérive de Test<T> ou non vous avez vraiment besoin d'exposer votre Value propriété. En d'autres termes, avez-vous besoin pour exposer les fonctionnalités disponibles uniquement pour les classes dérivées, ou pourriez-vous simplement exposer un Test<T>, avec toutes les fonctionnalités de la classe de base?

Dans ce dernier cas, vous pouvez simplifier la définition de la classe comme:

public class Wrapper<TKey> 
{ 
    public Test<TKey> Value { get; set; } 
} 

En ce qui concerne la fonctionnalité précise vous êtes à la recherche: Je ne crois pas tout à fait comme qui est disponible dans le courant version de C#.

Cela dit, une autre option dans votre cas pourrait être d'utiliser réellement votre classe elle-même Wrapper comme une classe de base:

public abstract class Test<TKey> 
{ 
    TKey Key { get; set; } 
} 

public abstract class Wrapper<TValue, TKey> 
    where TValue : Test<TKey> 
{ 
    public TValue Value { get; set; } 
} 

public class TestWrapper<TKey> : Wrapper<Test<TKey>, TKey> 
{ } 

// ... some code somewhere 
var tw = new TestWrapper<int>(); 
Test<int> value = tw.Value; 
+0

'Test' est une classe abstraite bien, basé sur des commentaires dans une question supprimée, vous ne pouvez pas encore voir (si je me souviens de mon représentant limites!), l'OP veut des classes qui héritent de 'Test ', pas la classe elle-même. Il veut quelque chose comme 'Wrapper ' ou 'Wrapper ' et TestChild' * en fait * être 'TestChild ' ... Je crois que la réponse est la même si, cela n'existe pas. Mais bon, peut-être qu'il y a un moyen d'obtenir ce que je ne connais pas ... Je suis sûr que l'IL peut le faire, mais je ne suis pas sûr de C#. –

Questions connexes