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