Search code examples
c#factory

C# Factory Method to Convert between similar types and preserve data


I'm trying to implement a factory method that attaches to two classes. They're essentially the same class, but belong to different namespaces. I want to preserve the data between the two classes as well. This is the outline of what I'm trying to do, but I'm very new to C#.

namespace MyMainNameSpace
{
   using MySubNameSpace;
   using MyOtherSubNameSpace;

   public static class FactoryClass
   {
      public static MyFirstClass ConvertToSecondClass()
      {
         var mySecondClass = new MySecondClass()
         {
            Attr1 = MyFirstClass().Attr1;
            Attr2 = MySecondClass().Attr2;
         };
         return mySecondClass;

      public static MySecondClass ConvertToFirstCLass()
      {
         var myFirstClass = new MyFirstClass()
         {
            Attr1 = MySecondClass().Attr1;
            Attr2 = MySecondClass().Attr2;
         }
         return myFirstClass;
      }
   }
}

namespace MyOtherSubNameSpace
{
   public class MySecondClass
   {
      public required string Attr1 { get; set; }
      public required string Attr2 { get; set; }
   }
}
namespace MySubNameSpace
{
   public class MyFirstClass
   {
      public required string Attr1 { get; set; }
      public required string Attr2 { get; set; }
   }
}

How do I extract the attributes Attr1 and Attr2 from each class to populate the new one in my factory method?


Solution

  • Your factory methods need to get an instance of the object they are trying to convert. You might try something like this:

    public static MySecondClass ConvertToSecondClass(MyFirstClass mfc)
    {
       var mySecondClass = new MySecondClass()
       {
          Attr1 = mfc.Attr1;
          Attr2 = mfc.Attr2;
       };
       return mySecondClass;
    }
    
    public static MyFirstClass ConvertToFirstCLass(MySecondClass msc)
    {
       var myFirstClass = new MyFirstClass()
       {
          Attr1 = msc.Attr1;
          Attr2 = msc.Attr2;
       }
       return myFirstClass;
    }
    

    Then you can use them:

    MyFirstClass a = new MyFirstClass()
    {
        Attr1 = "Foo",
        Attr2 = "Bar"
    };
    
    MySecondClass b = ConvertToSecondClass(a);
    

    Another nice way to do this is to use extension methods:

    public static MySecondClass ConvertToSecondClass(this MyFirstClass mfc)
    {
       var mySecondClass = new MySecondClass()
       {
          Attr1 = mfc.Attr1;
          Attr2 = mfc.Attr2;
       };
       return mySecondClass;
    }
    
    public static MyFirstClass ConvertToFirstCLass(this MySecondClass msc)
    {
       var myFirstClass = new MyFirstClass()
       {
          Attr1 = msc.Attr1;
          Attr2 = msc.Attr2;
       }
       return myFirstClass;
    }
    

    Then you can use them:

    MyFirstClass a = new MyFirstClass()
    {
        Attr1 = "Foo",
        Attr2 = "Bar"
    };
    
    MySecondClass b = a.ConvertToSecondClass();