C# 从类类型或字符串获取类引用

C# 从类类型或字符串获取类引用,c#,generics,reflection,C#,Generics,Reflection,因此,我一直在研究大量类似的问题,但似乎没有一个问题与我的尝试相同。我需要一个类的引用,而不是一个类实例 我试图动态地为泛型类型函数创建一个类引用。我的职能如下: private void CleanupTable<T, U>(DbSet<T> dbSet, CleanupModel.Tables table, DbSet<U> lastDbSet, dynamic removedRec) where T : class where U : class {

因此,我一直在研究大量类似的问题,但似乎没有一个问题与我的尝试相同。我需要一个类的引用,而不是一个类实例

我试图动态地为泛型类型函数创建一个类引用。我的职能如下:

private void CleanupTable<T, U>(DbSet<T> dbSet, CleanupModel.Tables table, DbSet<U> lastDbSet, dynamic removedRec) where T : class where U : class
{
    ParameterExpression tpe = Expression.Parameter(typeof(T));
    Expression idProp = Expression.Property(tpe, typeof(T).GetProperty(GetIdProperty(lastDbSet)));
    Expression constIdProp = Expression.Constant(removedRec.GetType().GetProperty(GetIdProperty(lastDbSet)).GetValue(removedRec, null), typeof(int));
    Expression completeExpression = Expression.Equal(idProp, constIdProp);

    Expression<Func<T, bool>> expression = Expression.Lambda<Func<T, bool>>(completeExpression, tpe);
    List<T> removedRecs = dbSet.Where(expression).ToList();

    removedRecs.ForEach(rec =>
    {
        DbSet nextSet = GetNextSet(dbSet);

        //Here is where I'm trying to create a reference using nextSet
        CleanupTable</*nextSetType reference*/, T>(nextSet, GetNextTable(dbSet), dbSet, rec);

        dbSet.Remove(rec);
        reportHelper.ReportSuccess(table, ReportHelper.ReportReasons.Linked, rec);
    });
}
我尝试过使用
GetType()
之类的东西,但泛型不接受
类型。我想做的事情可能吗?

解决方案 多亏了中间人的帮助,我解决了这个问题。我最终让
CleanupTable()
从参数推断类型。最初的问题是它无法推断
nextSet
的类型,因为它是泛型
DbSet
类型,并且不是隐式类型。我解决了这个问题,只需将相关值设置为dynamics,并让
CleanupTable()
在运行时计算出来

以下是更新的代码:

可清洗的

解决方案 多亏了中间人的帮助,我解决了这个问题。我最终让
CleanupTable()
从参数推断类型。最初的问题是它无法推断
nextSet
的类型,因为它是泛型
DbSet
类型,并且不是隐式类型。我解决了这个问题,只需将相关值设置为dynamics,并让
CleanupTable()
在运行时计算出来

以下是更新的代码:

可清洗的


你可以用。检查结尾处的示例,我不确定这是否符合我的要求。也许我还不太明白。你能详细说明一下吗?为什么类型推断不起作用?
GetNextSet
的签名是什么?
nextSet
的类型是什么?我为
GetNextSet
添加了代码。我返回一个
DbSet
,在我的代码的第一个例子中,它返回
DbSet
类型,我想把
Page
引用放到泛型函数调用中,然后让类型推断为您解决:
CleanupTable(nextSet,GetNextTable(DbSet),DbSet,rec)。编译器应该能够自己从
nextSet
类型和
U
形式的
dbSet
类型中计算出
T
。您可以使用。检查结尾处的示例,我不确定这是否符合我的要求。也许我还不太明白。你能详细说明一下吗?为什么类型推断不起作用?
GetNextSet
的签名是什么?
nextSet
的类型是什么?我为
GetNextSet
添加了代码。我返回一个
DbSet
,在我的代码的第一个例子中,它返回
DbSet
类型,我想把
Page
引用放到泛型函数调用中,然后让类型推断为您解决:
CleanupTable(nextSet,GetNextTable(DbSet),DbSet,rec)。编译器应该能够通过自己的
T
nextSet
类型和
U
dbSet
类型中计算出来。
private DbSet GetNextSet(CleanupModel.Tables table)
{
    switch (table)
    {
        case CleanupModel.Tables.Version: return context.Page;
        //More cases
        default: return null;
    }
}
private void CleanupTable<T, U>(DbSet<T> dbSet, CleanupModel.Tables table, DbSet<U> lastDbSet, dynamic removedRec) where T : class where U : class
{
    ParameterExpression tpe = Expression.Parameter(typeof(T));
    Expression idProp = Expression.Property(tpe, typeof(T).GetProperty(GetIdProperty(lastDbSet)));
    Expression constIdProp = Expression.Constant(removedRec.GetType().GetProperty(GetIdProperty(lastDbSet)).GetValue(removedRec, null), typeof(int));
    Expression completeExpression = Expression.Equal(idProp, constIdProp);

    Expression<Func<T, bool>> expression = Expression.Lambda<Func<T, bool>>(completeExpression, tpe);
    List<T> removedRecs = dbSet.Where(expression).ToList();

    removedRecs.ForEach(rec =>
    {
        dynamic nextSet = GetNextSet(table);
        if (nextSet == null)

        CleanupTable(nextSet, GetNextTable(table), dbSet, rec);

        dbSet.Remove(rec);
        reportHelper.ReportSuccess(table, ReportHelper.ReportReasons.Linked, rec);
    });
}
private dynamic GetNextSet(CleanupModel.Tables table)
{
    switch (table)
    {
        case CleanupModel.Tables.Version: return context.Page;
        //More cases

        default: return null;
    }
}