【发布时间】:2015-03-28 03:02:34
【问题描述】:
我正在尝试创建一个将动态生成内联 SQL 查询语句并传回各种对象的应用程序。我创建的每个对象类都有一个 IRowMapper GetMapping 方法。
我执行 SQL 并使用以下命令生成对象结果列表,在我的示例中,我将使用 Person 对象:
result.List = new List<Object>(db.ExecuteSqlStringAccessor<Person>(sql, Person.GetMapping()).ToList());
但是,我将有几种不同的对象返回类型,而不仅仅是 Person。我想知道是否可以从字符串中动态获取类并调用 ExecuteSQLStringAccessor。例如,像这样:
Type type = Type.GetType("MyClass", true);
result.List = new List<Object>(db.ExecuteSqlStringAccessor<type>(SSUDBHelper.OpenQueryRequest(sql, assoc), type.GetMapping()).ToList());
任何帮助将不胜感激,谢谢!
更新
我可以做这个吗:
result.List = new List<Object>(db.ExecuteSqlStringAccessor<Person>(sql, Person.GetMapping()).ToList());
result.List = new List<Object>(db.ExecuteSqlStringAccessor<Company>(sql, Company.GetMapping()).ToList());
result.List = new List<Object>(db.ExecuteSqlStringAccessor<Invoice>(sql, Invoice.GetMapping()).ToList());
通用?
【问题讨论】:
-
您可以使用所有模型都实现的基类,并使基类(或接口)具有 GetMapping 方法。或者使用类型通过反射来调用方法。最后,您可以使用 dynamic 并从那里调用它。
-
Person、Company和Invoice是否共享一个指定GetMapping成员的通用接口? -
另外,您可以使用
db.ExecuteSqlStringAccessor<Invoice>(sql, Invoice.GetMapping()).Cast<object>().ToList()进行投射,而不是您现在正在做的事情。 -
@Asad No、
Person、Company和Invoice没有通用接口。他们每个人只有自己的IRowMapper<className> GetMapping()方法。对象和类是由其他人设置的,我无法对现有的类或结构进行太多修改。 -
@ThreadedLemon 好的,那么你必须使用
dynamic。我会把这个放在答案中。
标签: c# database class generics dynamic