2010-04-13 8 views
0

Mon code:Casting d'un objet à une classe de base, renvoie l'objet étendu?

public class Contact 
{ 
    public string id{ get; set; } 
    public string contact_type_id { get; set; } 
    public string value{ get; set; } 
    public string person_id { get; set; } 
    public Contact() 
    { 

    } 
} 

public class Contact:Base.Contact 
{ 
    public ContactType ContactType { get; set; } 
    public Person Person {get; set;} 
    public Contact() 
    { 
     ContactType = new ContactType(); 
     Person = new Person(); 
    } 
} 

Et:

Contact c = new Contact(); 
Base.Contact cb = (Base.Contact)c; 

Le problème:

The **cb** is set to **Contac** and not to **Base.Contact**. 
Have any trick to do that???? 

Répondre

0

Je lis les réponses et ne comprennent toujours pas le problème! Quel est le problème avec le code ci-dessus? En outre, à partir des commentaires, je comprends que vous devez sérialiser la classe de base uniquement. Je pense qu'il n'y a pas de problème, pour commencer. Regardez l'exemple-

class A 
{ 
    public int a = -1; 
}; 

class B : A 
{ 
    public int b = 0; 
}; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     A aobj = new B(); 
     aobj.a = 100; // <--- your aobj obviously cannot access B's members. 
     Console.In.ReadLine(); 
    } 
} 

Maintenant, si vous devez rendre votre fonction de sérialisation virtuelle, alors oui, il y a un problème. Alors cela pourrait aider -

abstract class Ia 
{ 
    public abstract void Serialize(); 
} 
class A : Ia 
{ 
    public int a = -1; 
    sealed public override void Serialize() { 
     Console.Out.WriteLine("In A serialize"); 
    } 
}; 

class B : A 
{ 
    public int b = 0; 
    /* 
    * Error here - 
    public override void Serialize() 
    { 
     Console.Out.WriteLine("In B serialize"); 
    } 
    */ 

    //this is ok. This can only be invoked by B's objects. 
    public new void Serialize() 
    { 
     Console.Out.WriteLine("In B serialize"); 
    } 
}; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     A aobj = new B(); 
     aobj.Serialize(); 
     Console.In.ReadLine(); 
    } 
} 

//Output: In A serialize 
1

Rien à voir avec Silverlight.

C'est ce que le moulage fait - vous renvoyez toujours une référence à c, Base.Contact.

Vous ne pouvez pas appeler ContactType ou Person sur cb (à moins que vous ne soyez diffusé, ce qui n'est pas le cas).

Quel est le problème avec cela?

+0

Je dois sérialiser seulement ma classe de base, ceci est mon poblem !! – JoeLoco

+0

Le DataContractJsonSerializer fait un sérialiseur profond mais je n'ai besoin que de fonctionnalités sur Base.Contact. – JoeLoco

+0

J'ai besoin d'un DownCast, mais quand je jette l'objet Down son Cast Up mon cb !! – JoeLoco

1

Vous ne pouvez définitivement pas transformer une classe en l'une de ses classes de base en les castant. Selon le type de sérialisation que vous utilisez, vous pouvez indiquer au sérialiseur de supposer que la classe est du type de base, ce qui limiterait la sérialisation aux membres du type de base.

0

Ajouter un constructeur de copie dans une classe de base (par exemple public Contact(Contact other)) et vous pouvez le faire:

Contact c = new Contact(); 
Base.Contact cb = new Base.Contact(c);