53 votes

convertir une classe en une autre classe ou convertir une classe en une autre

ma question est indiquée dans ce code

j'ai la classe comme ça

 public class  maincs
{
  public int a;
  public int b;
  public int c;
  public int d; 
}

public class  sub1
{
  public int a;
  public int b;
  public int c;
}


public void methoda (sub1 model)
{
  maincs mdata = new maincs(){a = model.a , b = model.b , c= model.c} ;   

  // is there is a way to directly cast class sub1 into main like that    
  mdata = (maincs) model;    
}

79voto

Tyler Long Points 1216

Utilisez la sérialisation et la désérialisation JSON :

 using Newtonsoft.Json;

Class1 obj1 = new Class1();
Class2 obj2 = JsonConvert.DeserializeObject<Class2>(JsonConvert.SerializeObject(obj1));

Ou:

 public class Class1
{
    public static explicit operator Class2(Class1 obj)
    {
        return JsonConvert.DeserializeObject<Class2>(JsonConvert.SerializeObject(obj));
    }
}

Ce qui vous permet ensuite de faire quelque chose comme

 Class1 obj1 = new Class1();
Class2 obj2 = (Class2)obj1;

65voto

Anthony Pegram Points 58528

Vous avez déjà défini la conversion, il vous suffit d'aller un peu plus loin si vous souhaitez pouvoir caster. Par exemple:

 public class sub1
{
    public int a;
    public int b;
    public int c;

    public static explicit operator maincs(sub1 obj)
    {
        maincs output = new maincs() { a = obj.a, b = obj.b, c = obj.c };
        return output;
    }
}

Ce qui vous permet ensuite de faire quelque chose comme

 static void Main()
{
    sub1 mySub = new sub1();
    maincs myMain = (maincs)mySub;
}

7voto

Jake Pearson Points 9657

Vous pouvez modifier la structure de votre classe pour :

 public class maincs : sub1
{
   public int d; 
}

public class sub1
{
   public int a;
   public int b;
   public int c;
}

Ensuite, vous pouvez conserver une liste de sub1 et en transférer certains vers mainc.

2voto

Chris Shaffer Points 18066

Vous pouvez fournir une surcharge explicite pour l'opérateur cast :

 public static explicit operator maincs(sub1 val)
{
    var ret = new maincs() { a = val.a, b = val.b, c = val.c };
    return ret;
}

Une autre option serait d'utiliser une interface qui a les propriétés a, b et c et d'implémenter l'interface sur les deux classes. Ensuite, faites simplement en sorte que le type de paramètre à methoda soit l'interface au lieu de la classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X