扩展方法的C#帮助 - 将集合转换为另一种类型

时间:2010-08-13 20:05:06

标签: c# generics extension-methods type-conversion

我想转换自

 public class Party
 {
        public string Type { get; set; }
        public string Name { get; set; }
        public string Status { get; set;}
 }

并转换为

 public class Contact
 {
        public string Type { get; set; }
        public string Name { get; set; }
        public string Status { get; set;}
        public string Company {get;set;}
        public string Source {get;set;}    
 }

我尝试使用此扩展方法

   public static class EnumerableExtensions
    {
        public static IEnumerable<TTo> ConvertTo<TTo, TFrom>(this IEnumerable<TFrom> fromList)
        {
            return ConvertTo<TTo, TFrom>(fromList, TypeDescriptor.GetConverter(typeof(TFrom)));
        }

        public static IEnumerable<TTo> ConvertTo<TTo, TFrom>(this IEnumerable<TFrom> fromList, TypeConverter converter)
        {
            return fromList.Select(t => (TTo)converter.ConvertTo(t, typeof(TTo)));
        }
}

我收到此错误TypeConverter无法将“派对”转换为“联系人”

    var parties = new List<Party>();
        parties.Add(new Party { Name = "name 1", Status = "status 1" });
        parties.Add(new Party { Name = "name 2", Status = "status 2" });

        var results = parties.ConvertTo<Contact, Party>().ToList();

我在这里缺少什么?

2 个答案:

答案 0 :(得分:4)

类型Party和Type联系人之间没有直接转换(基于多态或继承)。

您需要为您的类型实现TypeConverter,以便.NET知道如何在这两种类型之间进行转换:

MSDN - TypeConverter Class

MSDN - How to Implement a TypeConverter

创建TypeConverters后,必须使用TypeConverterAttribute修饰两个类,以便Framework可以在运行时获取TypeConverter的实例:

public class PartyTypeConverter : TypeConverter
{
    // Implementation
}

[TypeConverter(typeof(PartyTypeConverter)]
public class Party
{
    public string Type { get; set; }
    public string Name { get; set; }
    public string Status { get; set; }
}

您还可以尝试使用LINQ模仿(我猜测的)所需行为(即使您将失去通用功能):

var contacts = parties.Select(p => new Contact {
    Type = p.Type,
    Name = p.Name,
    Status = p.Status
});

答案 1 :(得分:0)

这是一种略有不同的方式,虽然它的核心仍然只是简单地将成员值从一个对象复制到另一个对象

将此添加到您的Contact类

public static explicit operator Contact(Party p)
{
    return new Contact
    {
        Type = p.Type,
        Name = p.Name,
        Status = p.Status
    };
}

然后像这样转换:

List<Party> parties = new List<Party>();
parties.Add(new Party { Name = "Foo", Status = "Bar" });

parties.Select<Party, Contact>(p => (Contact)p)

您可能希望将最后一位包含在某些扩展方法中,但我没有看到一点...