将 Class 名称变量转换为 Class 类型 c#

Convert Class Name Variable to Class Type c#

我正在对 return 一些数据实施 Web api 方法。它工作正常,直到我们想要引入新参数来确定我们是否应该 return 产品的额外详细信息或只是正常的详细信息。

我原来的代码是这样的:

 using (IDbConnection conn = _context.Database.GetDbConnection())
                {


                var parameters = new
                {
                    CourseName = model.query,
                    CourseType = model.CourseType,
                    other parameters....
                };

                var obj = await conn.QueryAsync<Offering> ("SearchOfferings", parameters, commandType: CommandType.StoredProcedure);

                if (obj == null)
                    return NotFound("Record not found");

                return new ObjectResult(obj);
            }

我正在使用 DAPPER 来执行存储过程。

现在,我们添加了 querystring 中的额外参数,并将逻辑添加到现有代码中。如果 Extra = True,我们希望 return FullDetail 具有不同的对象类型。否则,return 只有简要数据。

我想知道如何在 QueryAsync(动态参数)方法中传递 objectToReturn 值?

string objectToReturn = string.Empty;
if (extra)
    objectToReturn = "Offering";
else
    objectToReturn= "BriefOffering";    

var obj = await conn.QueryAsync<**objectToReturn**> ("SearchOfferings", parameters, commandType: CommandType.StoredProcedure);

当客户端可以更改查询参数以获得详细的产品时,它也可能只是访问不同的资源来公开您的详细产品。

假设您当前的 REST API 产品资源是:

http:\server.com\offerings\{id}

为什么不再来一个像:

http:\server.com\detailedOfferings\{id}`

这使您的 REST 接口更易于使用和理解,同时也简化了实现。

如果您真的想坚持使用查询参数开关,那么您可以有条件地调用两种通用类型方法之一:

if (extra)
    return await conn.QueryAsync<Offering>(
        "SearchOfferings", parameters, commandType: CommandType.StoredProcedure);
else
    return await conn.QueryAsync<BriefOffering>(
        "SearchOfferings", parameters, commandType: CommandType.StoredProcedure);

Dapper 确实有备用的 Query / QueryAsync 方法签名可能对您有所帮助 - 有一个方法签名将 return 一组对象,其中每个对象都是通过方法参数而不是泛型指定的类型类型参数。

这将允许你做这样的事情:

var typeToReturn = Type.GetType("MyProject.Entities.Offering");
var obj = await conn.QueryAsync(
    type: typeToReturn,
    sql: "SearchOfferings",
    param: parameters,
    commandType: CommandType.StoredProcedure
);

类型名称必须是所需类型的全名,因此如果 QueryString 值仅指定 "Offering",则您必须知道该实体所在的名称空间并更改代码类似于

var nameOfType = "Offering";

const string entityNamespace = "MyProject.Entities";
var typeToReturn = Type.GetType(entityNamespace + "." + nameOfType);
var obj = await conn.QueryAsync(
    type: typeToReturn,
    sql: "SearchOfferings",
    param: parameters,
    commandType: CommandType.StoredProcedure
);

当然,将 return 类型设置为 IEnumerable 意味着您不能轻易地直接对 returned 数据做很多事情,但情况总是如此,如果您想为 return 动态类型代码编写一些代码;你不会在编译时知道什么类型会回来。例如,如果您只是将其序列化为 JSON,那没什么大不了的。

我只是想添加这个答案,因为它直接解决了您的问题 - 但我也同意 Sam C 的评论,您最好使用 returns IEnumerable 的方法签名,如果老实说,您根本不关心 returned 的类型。