c# - 如何在 C# 中将泛型类转换为泛型接口(interface)

标签 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 类相关的方法和能力。这是一个好的解决方案吗?为什么?

最佳答案

在 C# 3.0 和 odler 中,这并不容易实现 - 另请参阅 C# 4.0 中的 covariance and contravariance

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

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

关于c# - 如何在 C# 中将泛型类转换为泛型接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3681098/

相关文章:

java - 如何避免在子类中强制转换父级字段

swift - 无法推断通用参数 'Subject'

c# - 如何避免重复的 Cursor.Current 语句?

c# - 使用 MSTSCLib 登录远程桌面

c++ - C->C++ 在未给出类型的情况下,在#define 中自动将 void 指针转换为 C++ 中的类型指针(C 风格)[MSVS]

swift - 需要时如何将 Float 转换为 Int?

java - 具有通用接口(interface)的通用类编译失败

java - 关于 Java 泛型下限用法 : ? super T

c# - 如何在 Winforms 应用程序中实现从小型 WPF 元素宿主的拖放操作?

c# - 如何为 PropertyDescriptor 定义类级属性以对 BindingList 进行排序?