c# - 将具体类转换为通用基接口(interface)

标签 c# interface generics casting radix

这是我遇到的情况:

public abstract class Record { }

public abstract class TableRecord : Record { }

public abstract class LookupTableRecord : TableRecord { }

public sealed class UserRecord : LookupTableRecord { }

public abstract class DataAccessLayer<TRecord> : IDataAccessLayer<TRecord>
    where TRecord : Record, new() { }

public abstract class TableDataAccessLayer<TTableRecord> : DataAccessLayer<TTableRecord>, ITableDataAccessLayer<TTableRecord>
    where TTableRecord : TableRecord, new() { }

public abstract class LookupTableDataAccessLayer<TLookupTableRecord> : TableDataAccessLayer<TLookupTableRecord>, ILookupTableDataAccessLayer<TLookupTableRecord>
    where TLookupTableRecord : LookupTableRecord, new() { }

public sealed class UserDataAccessLayer : LookupTableDataAccessLayer<UserRecord> { }

public interface IDataAccessLayer<TRecord>
    where TRecord : Record { }

public interface ITableDataAccessLayer<TTableRecord> : IDataAccessLayer<TTableRecord>
    where TTableRecord : TableRecord { }

public interface ILookupTableDataAccessLayer<TLookupTableRecord> : ITableDataAccessLayer<TLookupTableRecord>
    where TLookupTableRecord : LookupTableRecord { }

现在,当我尝试执行以下转换时,它无法编译:

UserDataAccessLayer udal = new UserDataAccessLayer();
            ITableDataAccessLayer<TableRecord> itdal = (ITableDataAccessLayer<TableRecord>)udal;

但是,当我执行以下转换时,它编译时没有运行时错误:

UserDataAccessLayer udal = new UserDataAccessLayer();
            ITableDataAccessLayer<UserRecord> itdal = (ITableDataAccessLayer<UserRecord>)udal;

我真的需要和基地一起工作ITableDataAccessLayer<TableRecord>接口(interface),因为我不知 Prop 体类型。

希望这是描述性的并且足以回答我的问题。

最佳答案

.NET 4.0 支持您尝试执行的操作,但 3.5 不支持。它叫做 generic covariance 。与此同时,您可以做的是创建一个名为 ITableDataAccessLayer 的非通用接口(interface)(在您使用 T 的任何地方都使用 Object 类型)并提供显式接口(interface)实现。这是 .NET 中处理它的泛型类型的数量。

关于c# - 将具体类转换为通用基接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1778030/

相关文章:

PHP 7 接口(interface),返回类型提示和 self

java - 如何在 Java 中使用 Class<T>?

c++ - 有没有办法在 C++ 泛型类中透明地包装可比较的 C 结构?

javascript - C# 中的进度条

c# - 格式不太好的json的反序列化

go - 使用接口(interface)为任意类型创建队列

c# - 泛型仅支持引用转换,不支持装箱转换

c# XmlReader : reading attributes from start element 收藏

c# - System.Drawing.Image 的 Nhibernate 映射

c++ - 菱形继承(钻石问题)两次派生 - 构造函数参数不同 - 找不到指定虚拟继承的基础