2010-05-11 5 views
3

J'ai donc écrit un petit morceau de code pour accélérer la conversion entre les objets métier et les modèles de vue. Pas pour proxénète mon propre blog, mais you can find the details here si vous êtes intéressé ou avez besoin de savoir. Un problème que j'ai rencontré est que j'ai un type de collection personnalisé, ProductCollection, et je dois le transformer en une chaîne [] sur mon modèle. Évidemment, puisqu'il n'y a pas de distribution implicite par défaut, j'obtiens une exception dans mon convertisseur de contrat.Conversions de types implicites dans Reflection

Donc, je pensais écrire le petit morceau de code suivant et qui devrait résoudre le problème:

public static implicit operator string[](ProductCollection collection) { 
    var list = new List<string>(); 
    foreach (var product in collection) 
    { 
     if (product.Id == null) 
     { 
      list.Add(null); 
     } 
     else 
     { 
      list.Add(product.Id.ToString()); 
     } 
    } 
    return list.ToArray(); 
} 

Cependant, il ne fonctionne toujours pas avec la même exception en fonte. Je me demande si cela a quelque chose à voir avec la réflexion? Si oui, y a-t-il quelque chose que je puisse faire ici? Je suis ouvert aux solutions architecturales, aussi!

+0

Quelle valeur intrinsèque espérez-vous obtenir en ajoutant les chaînes nulles à la liste que vous générez? Je me demandais juste. –

+0

Vous avez dit 'cast exception' mais avez déclaré un opérateur' implicit'. Voulez-vous dire déclarer un opérateur 'explicite'? Postez le code là où vous vous attendez à ce que cela se déclenche. –

+0

Nathan Taylor, si product.Id était nul, un ToString() sur lui mettrait fin à l'univers. –

Répondre

3

Tout d'abord, l'opérateur implicit permet les conversions implcit (pas de directive de diffusion). explicit opérateurs opèrent sur les moulages.

Néanmoins, ce n'est pas le vrai problème ici. Les opérateurs ne sont pas polymorphes (ils sont surchargés, pas surchargé); c'est-à-dire, pour tirer parti d'un opérateur surchargé, vous devez faire référence à une classe dans le contexte de la classe qui la définit.

Par exemple:

public class Foo 
{ 
    public static implicit operator Bar(Foo foo) { return new Bar(); } 
} 

public class Bar { } 

... 

void Baz() 
{ 
    Foo foo = new Foo(); 

    Bar bar = foo; // OK 

    object baz = foo; 

    bar = baz; // won't compile, there's no defined operator at the object level 

    bar = (Bar)baz; // will compile, but will fail at runtime for the same reason 
} 

Sans savoir ce que vous faites et comment vous le faites, je ne peux pas offrir beaucoup de la manière d'une solution de rechange. Quelques idées, cependant:

  1. Remplacer ToString (ou utiliser une classe/interface de base commune pour vos entités avec votre propre version si vous ne voulez pas utiliser ToString) sur vos entités, puis énumérer les collections génériquement pour construire votre tableau de chaînes
  2. Fournir une fonction ToStringArray sur vos collections (par le biais d'une classe de base commune ou interface) qui fait quelque chose de similaire

Le plus grand point est pas d'utiliser des opérateurs à cet effet; ils ne t'aideront pas.

+0

Ceci est une excellente explication. Merci! Il s'agit d'une partie obscure du langage que je ne connaissais pas avant de chercher une solution pour cela. –

Questions connexes