【发布时间】:2020-09-09 15:54:32
【问题描述】:
我正在努力解决与泛型之间转换相关的问题,这可能是一个简单的问题。 基本上我想创建一个基类列表并添加多个类。
public interface IQueryEngineDependency
{
public IEnumerable<QueryDependencyDetail> GetDependencies<>();
}
public abstract class QueryDependencyDetail
{
public int Order { get; set; }
}
public class QueryDependencyDetail<TEntity, TKey> : QueryDependencyDetail
where TEntity : BaseEntity<TKey>
{
public virtual Func<TEntity, object> Key { get; set; }
public IQueryable<TEntity> Data { get; set; }
public Func<TEntity, object> JoinKey { get; set; }
public Expression<Func<TEntity, bool>> WhereClause { get; set; }
}
问题
例如,我有一个类实现了上面显示的接口,但我正在找出实现它的正确方法。
public class TestQueryDependency : IQueryEngineDependency
{
public IEnumerable<QueryDependencyDetail> GetDependencies()
{
var dependencies = new List<QueryDependencyDetail>
{
new QueryDependencyDetail<Tasks, long>
{
Order = 1,
Data = null // just to simplify
}
};
return dependencies;
}
}
如果我在代码中的某处调用GetDependencies 方法,我该如何进行向下转换以访问泛型类型字段?我的意思是我会得到QueryDependencyDetail 类型的实例。那么是否可以将其转换为QueryDependencyDetail<TEntity, TKey>?
还是有其他方法可以做到这一点?
编辑
var testDep = new TestQueryDependency();
var dependencies = testDep.GetDependencies();
请记住,在我的特定实现中,依赖项可能有多达 20 个不同的实例。 例如,我如何访问数据字段? (只是一个简单的场景)
var first = dependencies.FirstOrDefault()?.Data; ?????
我将需要它来使用 LINQ 执行动态查询。
提前致谢。
【问题讨论】:
-
我的代码没有任何问题。你说的向下投射是什么意思。能否请您详细说明问题
-
我将编辑问题以使其更加明确。 Tks
-
如果调用 GetDependencies 的人需要
QueryDependencyDetail<TEntity, TKey>,而不是QueryDependencyDetail,那么 这就是该方法需要返回的内容。否则它可能根本就不是QueryDependencyDetail<TEntity, TKey>实例,您将无法更改它。 -
IQueryable和IQueryable<T>的关系类似。IQueryable有一个ElementType属性,IQueryable<T>实现返回typeof(T)。如果GetDependencies可以返回多个不同紧密构造类型的QueryDependencyDetail<TEntity, TKey>对象,那么在QueryDependencyDetail中具有EntityType和KeyType属性可能使您能够完成所有需要的反射和表达式构建。但是,如果不知道如何您打算使用它“使用 LINQ 执行动态查询”,很难更具体。 -
请edit 您的问题包括如何您打算使用返回的序列(如问题所示,而不是 cmets 中的变化)。如果您不知道需要什么来构建查询表达式,则无法知道如何更改它。