在C#中将类型传递给函数

29 浏览
0 Comments

在C#中将类型传递给函数

我正在使用.NET Core 2.1和Entity Framework Core。

在我的项目中,我定义了不同的模型/实体/类型,例如:Student,Class,Teacher。

我正在获取这些模型的表数据来设置我的缓存。

目前,我是这样做的:

string[] tablesToBeCached  = { "Student", "Class", "Teacher" };
foreach(var table in tablesToBeCached)
{
    cache.Set(key, GetTableData(dbContext, table));
}

而函数GetTableData()的定义如下:

public IEnumerable GetTableData(DBContext dbContext, string tableName)
{
    switch (tableName)
    {
        case "Student":
            return dbContext.Student;
        case "Class":
            return dbContext.Class;
        case "Teacher":
            return dbContext.Teacher;
        default:
            return null;
     }
}

我希望这段代码变得更智能和简短。

我尝试了以下方法,但没有成功(错误为“'x'是一个变量,但被用作类型”):

List entities = new List { typeof(Student), typeof(Class), typeof(Teacher) };
entities.ForEach(x => GetTableData(x, dbContext));
public IEnumerable GetTableData(object x, DBContext dbContext)
{
    return dbContext.Set();
}

有人可以帮忙吗?在C#中是否可能实现这个?

0
0 Comments

上面的代码实现了一个通用的缓存设置方法,通过传递不同的类型来获取表格数据并将其缓存起来。然而,在实现过程中可能会遇到一些问题。

问题的原因是在这段代码中,使用了反射来获取 `GetTableData` 方法并将其转换为泛型方法。然而,在传递类型参数时,可能会出现类型无法解析的情况。这可能是因为类型的命名空间或程序集名称不正确,或者类型根本不存在。

为了解决这个问题,我们可以采取以下措施:

1. 确保传递的类型参数的命名空间和程序集名称是正确的,并且确保类型存在于应用程序中。

2. 可以使用 `Type.GetType` 方法来获取类型,并将命名空间和程序集名称作为参数传递。这样可以确保获取正确的类型。

3. 在获取类型后,可以使用 `MakeGenericMethod` 方法来创建泛型方法的实例。

4. 最后,可以使用反射调用 `Invoke` 方法来调用泛型方法,并将返回值缓存起来。

通过这些步骤,我们可以解决传递类型给函数的问题,并成功地将表格数据缓存起来。

希望这篇文章对你有帮助!

0
0 Comments

问题的出现原因:

问题的出现是因为需要在C#中将不同类型的实体传递给同一个函数。在给定的示例中,需要将不同的实体类型传递给GetTableData函数,并将结果存储在缓存中。

解决方法:

解决方法是使用泛型。通过将泛型参数添加到函数签名中,可以在不同的实体类型上调用相同的函数。

首先,使用泛型参数重写GetTableData函数:

public static IEnumerable<T> GetTableData<T> (DBContext dbContext)
{
     return dbContext.Set<T>();
}

然后,通过将不同的实体类型作为泛型参数传递给GetTableData函数,可以将结果存储在缓存中:

cache.Set(key1, GetTableData<Student>(dbContext));
cache.Set(key2, GetTableData<Class>(dbContext));
cache.Set(key3, GetTableData<Teacher>(dbContext));

然而,如果有很多实体类型需要处理,重复写cache.Set()将变得冗长和繁琐。为了解决这个问题,可以使用反射来自动处理不同的实体类型。

首先,确保实体类型实现了一个公共接口或基类,例如IEntity:

interface IEntity {}
class Student: IEntity {}
class Teacher: IEntity {}

然后,可以使用反射来获取实现IEntity接口的所有类型:

var type = typeof(IEntity);
var types = AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany(s => s.GetTypes())
    .Where(p => type.IsAssignableFrom(p));

最后,使用foreach循环调用GetTableData函数,并使用反射调用相应的泛型方法:

MethodInfo method = GetType.GetMethod("GetTableData ");
foreach (var entityType in types)
{
    MethodInfo genericMethod = method.MakeGenericMethod(entityType);
    genericMethod.Invoke(this, null);
}

通过这种方式,可以自动处理多个实体类型,避免重复编写代码,并实现将不同的实体类型传递给同一个函数的目的。感谢给出指导的人。

0