【问题标题】:C# - Executing and Determining Class Calls DynamicallyC# - 动态执行和确定类调用
【发布时间】: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 并从那里调用它。
  • PersonCompanyInvoice 是否共享一个指定 GetMapping 成员的通用接口?
  • 另外,您可以使用db.ExecuteSqlStringAccessor&lt;Invoice&gt;(sql, Invoice.GetMapping()).Cast&lt;object&gt;().ToList() 进行投射,而不是您现在正在做的事情。
  • @Asad No、PersonCompanyInvoice 没有通用接口。他们每个人只有自己的IRowMapper&lt;className&gt; GetMapping() 方法。对象和类是由其他人设置的,我无法对现有的类或结构进行太多修改。
  • @ThreadedLemon 好的,那么你必须使用dynamic。我会把这个放在答案中。

标签: c# database class generics dynamic


【解决方案1】:

由于GetMapping是一个静态方法,我们只能使用反射在运行时解决它:

IEnumerable<T> GetAsListOf<T>(string sql, YourDBType db) {
    IRowMapper<T> mapper = (IRowMapper<T>)typeof(T).GetMethod("GetMapping").Invoke(null, null);
    return db.ExecuteSqlStringAccessor<T>(sql, mapper);
}

【讨论】:

  • 我对反射的整个想法还是很陌生。我应该像GetAsListOf&lt;type&gt;(sql, db); 这样称呼它吗?它说找不到类型或命名空间“类型”。
  • @ThreadedLemon 你不应该直接使用类型参数type。你可以GetAsListOf&lt;Person&gt;(sql, db),它会给你一个IEnumerable&lt;Person&gt;
  • 啊,好吧......但如果我不知道它会是 Person 类型直到运行时,我可以不做类似 Type type = Type.GetType(dataType, true); 的事情,其中​​ dataType 是一个字符串“人”、“发票”还是“公司”?
  • @ThreadedLemon 好的,所以基本上您希望将类型设置为从 typeof 或其他方式获得的一些实例化的 System.Type,并且您希望从该类型转到 IEnumerable类型,从数据库中检索。对吗?
  • @ThreadedLemon 好的,假设您的 Type 实例位于 MyType 中:为了调用此 GetAsListOf 方法,您需要这样做:MethodInfo method = typeof(this).GetMethod("GetAsListOf"); MethodInfo generic = method.MakeGenericMethod(myType); var result = generic.Invoke(this, new object[] {sql, db});
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多