转换不同类但相同类型的对象

时间:2009-05-12 22:57:10

标签: c# casting

我有两个来自同一个表的LINQ2SQL生成的类,因此它们具有完全相同的属性。

我想将一个对象转换/转换为另一个类。最简单的方法是什么?

我知道我可以手动分配每个属性,但这是很多代码。

4 个答案:

答案 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;
    }
}

只要类型属性对齐,就可以使用它来序列化From类型,然后使用BinaryFormatter反序列化为To类型,并将Binder属性设置为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 :(得分:1)

您将不得不手动执行此操作,或使用灵活的序列化框架来解决此问题。你可以使用内置的json serializer(导出到json,然后从json导入)。甚至是XmlSerializer。

答案 2 :(得分:1)

MiscUtil有一些代码可以使用Expression执行此操作 - 例如:

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

答案 3 :(得分: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强制转换/引用这两个类。我不确定这是否是你想要的,但它可能有用。另一个选项是重新加载具有相同id的其他对象类型。