如何将泛型类转换为C#中的泛型接口

时间:2010-09-09 22:46:45

标签: c# casting generics

根据以下定义

interface myin
{
    int id { get; set; }
}
class myclass:myin
{
    public int id { get; set; }
}
[Database]
public sealed class SqlDataContext : DataContext, IDataContext
{
    public SqlDataContext(string connectionString) : base(connectionString){}
    public ITable<IUrl> Urls
    {
        get { return base.GetTable<Url>(); }  //how to cast Table<Url> to ITable<IUrl>?
    }
    ...
}

更新

public IEnumerable<IUrl> Urls
{
    get { return base.GetTable<Url>(); }
}

所以通过使用上面的方法,我没有Table类关联的方法和能力。这是好的解决方案吗?为什么?

1 个答案:

答案 0 :(得分:4)

在C#3.0和odler中,这是不可能的 - 请参阅C#4.0中的covariance and contravariance

问题是Table<Url>实现了ITable<Url>接口 - 这部分转换很容易。棘手的一点是将ITable<Url>投射到ITable<IUrl>,因为这两种类型实际上并没有任何关联......

在4.0之前的C#中,没有简单的方法可以做到这一点 - 你明确需要为正确的泛型类型(例如通过委托)创建ITable<..>的新实现。在C#4.0中,只要ITablecovariant interface,就可以完成此转换。