2009-05-12 7 views
4

У меня есть два класса, сгенерированные LINQ2SQL как из одной таблицы, так и с одинаковыми свойствами.Литые объекты разных классов, но одинаковые типы

Я хочу преобразовать/передать объект другому классу. Каков самый простой способ сделать это?

Я знаю, что могу просто вручную назначить каждое свойство, но это много кода.

+0

Как это произошло? Как вы закончили с двумя классами, описывающими одну и ту же таблицу? –

ответ

8

Вы можете использовать сериализацию, чтобы сделать копию довольно легко, создавая SerializationBinder. Это позволит вам десериализоваться от одного типа к другому.

class MySerializationBinder : SerializationBinder 
{ 

    public override Type BindToType(string assemblyName, string typeName) 
    { 
      Type typeToDeserialize = null;  

      // To return the type, do this: 
      if(typeName == "TypeToConvertFrom") 
      { 
       typeToDeserialize = typeof(TypeToConvertTo); 
      } 

      return typeToDeserialize; 
    } 
} 

Пока свойства типа выстраиваться вы можете использовать это, чтобы сериализовать От типа, а затем десериализации в Чтобы ввести с помощью BinaryFormatter и установив свойство Binder к экземпляру вашего класса связующего. Если у вас есть несколько типов объектов, вы можете использовать один Binder для покрытия всех разных типов.

Отражение - это еще один вариант, который вы можете решить, чтобы решить эту проблему. Если имена свойств точно совпадают, вы можете написать простой метод, который принимает значения из одного свойства и присваивает свойство с тем же именем.

public static void CopyObject(object source, object destination) 
{ 
    var props = source.GetType().GetProperties(); 

    foreach (var prop in props) 
    { 
     PropertyInfo info = destination.GetType().GetProperty(prop.Name); 
     if (info != null) 
     { 
      info.SetValue(destination, prop.GetValue(source, null), null); 
     } 
    } 
} 
1

Вам придется либо сделать это вручную, либо использовать гибкую структуру сериализации, чтобы обойти это. Возможно, вы можете использовать встроенный json serializer (экспорт в json, затем импорт из json). Или даже XmlSerializer.

1

MiscUtil имеет некоторый код, чтобы сделать это с помощью Expression - например:

Foo foo = ... 
Bar bar = PropertyCopy<Bar>.CopyFrom(foo); 
0

Вы можете создать интерфейс, который обладает свойствами вашего linq для классов sql, и реализовать оба интерфейса.

 
namespace 
{ 
public partial class MyClassA : IInterfaceName 
{ 
} 

public partial class MyClassB : IInterfaceName 
{ 
} 

public interface IInterfaceName 
{ 
    string PropertyA {get; set;} 
    int PropertyB {get; set;} 
    void MyMethod(); 
} 
} 

Это позволит вам отображать/ссылаться на оба класса с использованием IInterfaceName. Я не уверен, что это то, что вы хотите, однако это может быть полезно. Другой вариант - перезагрузка другого типа объекта с тем же идентификатором.

Смежные вопросы