2010-03-09 10 views
0

J'ai besoin d'une classe wrapper qui expose certaines propriétés de ma classe d'entités appelées ProfileEntity.Impossible d'effectuer une conversion

J'ai essayé de le faire en dérivant de cette entité, puis en créant des propriétés qui renvoient des propriétés d'entité spécifiques, mais il dit que je ne peux pas passer de ProfileEntity à ProfileEntityWrapper.

Lorsque j'essaie de placer les valeurs de retour d'une méthode qui renvoie un 'ProfileEntity' dans l'encapsuleur, j'obtiens l'erreur ci-dessus.

Comment créer une classe wrapper qui peut être convertie?

Exemple

class ProfileEntityWrapper : ProfileEntity 
{ 
    public string Name 
    { 
     get 
     { 
      return this.ProfileEntityName; 
     } 
    } 
} 

public class Someclass 
{ 
    public ProfileEntity SomeMethod() 
    { 
    return ProfileEntity; // example of method returning this object 
    } 
} 

public class SomeOtherlClass 
{ 
    SomeClass sc = new SomeClass(); 

    public void DoSomething() 
    { 
    ProfileEntityWrapper ew = (ProfileEntityWrapper)sc.SomeMethod(); // Cannot do this cast!!! 
    } 
} 
+0

pourrait vous montrer un code? class a: b {} vous permettrait de faire (a) b; et vous n'auriez pas besoin de faire (b) a; car a serait déjà un b –

+0

@Rune FS: ajouté un exemple de code –

+0

car SomeMethod renvoie l'instance de ProfileEntity mais pas l'instance de ProfileEntityWrapper. – garik

Répondre

1

Vous ne pouvez pas lancer un objet de ProfileEntity à ProfileEntityWrapper.

var entity = new ProfileEntity(); // this object is only of type ProfileEntity 
var wrapper = new ProfileEntityWrapper(); // this object can be used as both ProfileEntityWrapper and ProfileEntity 

Vous voulez probablement retourner un ProfileEntityWrapper dans SomeMethod():

public class Someclass 
{ 
    public ProfileEntity SomeMethod() 
    { 
     return new ProfileEntityWrapper(); // it's legal to return a ProfileEntity 
    } 
} 
+0

Mais je le veux dans l'autre sens, y at-il une solution à cela? –

+1

Dans mon esprit, un wrapper ne doit pas hériter du type enveloppé. Essayez de faire en sorte que le wrapper reçoive un ProfileEntity via le constructeur et souvenez-vous-en dans une variable membre, ProfileEntity privée _innerEntity; Dans la propriété Name, vous obtenez return _innerEntity.ProfileEntityName; – bjornhol

1

Non, cela est impossible.

Pour ce problème, vous pouvez peut-être essayer celui-ci:

public class ProfileEntity 
{ 
    public string ProfileEntityName { get; set; } 
} 

public class ProfileEntityWrapper 
{ 
    public ProfileEntityWrapper(ProfileEntity entity) 
    { 
     Entity = entity; 
    } 

    public ProfileEntity Entity { get; private set; } 

    public string Name 
    { 
     get 
     { 
      return Entity.ProfileEntityName; 
     } 
    } 
} 

public class SomeClass 
{ 
    public ProfileEntity SomeMethod() 
    { 
     // example of method returning this object 
     ProfileEntity temp = new ProfileEntity(); 
     return temp; 
    } 
} 

public class SomeOtherClass 
{ 
    SomeClass sc = new SomeClass(); 

    public void DoSomething() 
    { 
     //Create a new Wrapper for an existing Entity 
     ProfileEntityWrapper ew = new ProfileEntityWrapper(sc.SomeMethod()); 
    } 
} 
0

Si vous êtes autorisé à modifier la classe ProfileEntity, ou si la classe ProfileEntity est une classe partielle générée, vous pouvez ajouter une interface au lieu de en utilisant un wrapper. Vous n'auriez pas besoin de faire du casting avec une interface non plus. Exemple:

public interface IProfile 
{ 
    string Name { get; } 
} 

public partial class ProfileEntity : IProfile 
{ 
    public string Name 
    { 
     get 
     { 
      return this.ProfileEntityName; 
     } 
    } 
} 

public class SomeClass 
{ 
    public ProfileEntity SomeMethod() 
    { 
     return ProfileEntity; 
    } 
} 

public class SomeOtherClass 
{ 
    SomeClass sc = new SomeClass(); 

    public void DoSomething() 
    { 
     IProfile ew = sc.SomeMethod(); 
    } 
} 

L'instance IProfile fournit uniquement l'accès à la propriété Name.

0

Ce code n'est pas correct du point de vue du polymorphisme. Si nous prenons le fameux exemple de polymorphisme quand il existe une classe Shape de base et des classes Circle, Polygon et Rectangle qui étendent la classe Shape, votre code essaiera de transformer une forme en cercle et si vous comprenez cette opération invalide. Donc, pour faire fonctionner ce code, vous devez être sûr que SomeClass.SomeMethod() retourne instance de ProfileEntityWrapper ou effectuer une vérification de type avant la coulée, comme ceci:

ProfileEntity temp = sc.SomeMethod(); 
if(temp is ProfileEntityWrapper) 
    ProfileEntityWrapper ew = (ProfileEntityWrapper) temp;