将对象转换为另一个

时间:2013-08-30 09:41:04

标签: c# type-conversion

我有一个类,它是我引用的程序集的一部分。 我想转换该类型的对象 到我自己的类,实现我引用的类

让我说我的参考

public class customer
{
public string name {get;set}
public string address{get;set}
}

我创造了

public class mycustomer : customer
{
 public string name {get; set}
 public string address{get;set}
 public string email {get;set}
}

如何将客户转换为mycustomer并返回 我已经阅读了关于使用反射的内容,但是我对它不太满意,实际上是自己写的。

PS。请停止使用命名约定语义 - 这是一个粗略的动态理论示例(这里没有使用命名约定,仅在实际代码中) 提前致谢

编辑:只是想通了我无论如何都做不到这一点。 我需要序列化一个没有serializable属性的对象,我想我可以镜像该类并使其可序列化 - 但我只是意识到这个类中的一些属性没有serializable属性。

非常感谢 - 我会将问题的最佳答案标记为答案 /亚历

4 个答案:

答案 0 :(得分:3)

Automapper可以帮到你。

或者如果您只有课程,那么编写自己的课程非常简单。

private mycustomer(customer c)
{
    return new mycustomer { name = c.Name, address = c.address,email = c.email };
}

但是你不应该你不需要继承来映射

public class mycustomer : customer

应该是

public class mycustomer

您还应该使用naming convention

public class MyCustomer
{
   public string Name {get; set}
   public string Address{get;set}
   public string Email {get;set}
}

答案 1 :(得分:3)

无需亲自书写。您可以使用此通用算法的反射将Customer的属性复制到MyCustomer对象:

    public B Convert<A, B>(A element) where B : A, new()
    {
        //get the interface's properties that implement both a getter and a setter
        IEnumerable<PropertyInfo> properties = typeof(A)
            .GetProperties()
            .Where(property => property.CanRead && property.CanWrite).ToList();

        //create new object
        B b = new B();

        //copy the property values to the new object
        foreach (var property in properties)
        {
            //read value
            object value = property.GetValue(element);

            //set value
            property.SetValue(b, value);
        }

        return b;
    }

我认为在一个场景中使用像AutoMapper这样的完整版库有点矫枉过正。

答案 2 :(得分:2)

mycustomer已经拥有从customer继承的成员。不要隐藏这些成员:

public class customer
{
    public string name { get; set; }
    public string address { get; set; }
}

public class mycustomer : customer
{ 
    // name and address are inherited
    public string email { get; set; }
}

现在mycustomercustomer,此转化没有问题 - 只需将mycustomer的实例分配给customer类型的变量:

mycustomer mc = new mycustomer();
customer c = mc;

将它们转换回来很奇怪,因此customer没有email属性并且它不会出现 - 你仍然只有基类型提供的数据,所以在这里只需使用基类型。但如果客户实际上是一个mycustomer实例(参见上面的代码),那么你需要的就是:

mycustomer mc2 = (mycustomer)c;

BT#在C#中我们使用PascalNaming作为类型名称和公共成员。

答案 3 :(得分:0)

简单方法!

NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cProperties];
                                                          ^^^^^^^^^^^

“投射”方法实施遵循此视频 https://www.youtube.com/watch?v=XUqfg9albdA