泛型函数引发强制转换异常

时间:2020-02-06 13:26:40

标签: c# generics casting

我有一个奇怪的问题。 :(

我从数据库中获取了一个可枚举的对象,并且想要将这些对象转换为基类对象的列表或完全分解的派生类对象的列表。在某些情况下,我想削减我不需要的属性-因此标准多态性不是我的理想选择。此功能位于Web服务中,我必须优化流量。

因此,我编写了一个泛型函数,用于将整个列表转换为所需的类型。但是在派生类型的情况下,我得到一个强制转换错误。但是我不明白该消息,因为源对象没有类型,消息正在告诉我。

任何想法出了什么问题?提前谢谢!

using System;
using System.Collections.Generic;
using System.Linq;

class DBClass {
    public string id { get; set; }
    public string name { get; set; }

    public DBClass() { id = Guid.NewGuid().ToString(); }
}

class BaseClass {
    public Guid ID { get; set; }

    public static explicit operator BaseClass(DBClass x) {
        return new BaseClass() {
            ID = new Guid(x.id)
        };
    }
}

class DerivedClass : BaseClass {
    public string Name { get; set; }

    public static explicit operator DerivedClass(DBClass x) {
        return new DerivedClass() {
            ID = new Guid(x.id),
            Name = x.name
        };
    }
}

class Program
{
    static List<BaseClass> convertToList<T>(IEnumerable<DBClass> xx) where T : BaseClass
    {
        // solution from Jeroen Mostert (see comments):
        return xx.Select(obj => (BaseClass) (T) (dynamic) obj).ToList();

        // original code with error
        var l = xx.Select( obj => (T) obj);
        // T == BaseClass: everything is fine
        // T == DerivedClass: Unable to cast object of type 'BaseClass' to type 'DerivedClass'.
        // but obj is of type DBClass!

        return l.ToList() as List<BaseClass>;
    }

    static void Main(string[] args)
    {
        List < DBClass >  dbValues = new List<DBClass>();
        dbValues.Add(new DBClass());
        dbValues.Add(new DBClass());
        dbValues.Add(new DBClass());

        convertToList<BaseClass>(dbValues);     // ok
        convertToList<DerivedClass>(dbValues);  // KO
    }
}

0 个答案:

没有答案