重构对通用方法的重复调用

时间:2019-05-28 10:08:15

标签: c# generics refactoring

我有一段这样的代码:( MyClassX只是我的业务对象的简写,以后可能会扩展...

select member_ID,
  count(*)
from (
  select distinct a.eventID, m.memberID
  from attendants a
  inner join cars c
  on a.carID = c.car_ID
  inner join members m
  on c.memberID = m.memberID
  group by a.eventID, m.memberID
)
group by memberID

并希望以某种方式对其进行重构,以避免重复并使其更易于维护。一种尝试类似于

var conn = new SQLiteAsyncConnection(dbPath);

conn.CreateTableAsync<MyClass1>().Wait();
conn.CreateTableAsync<MyClass2>().Wait();
conn.CreateTableAsync<MyClass3>().Wait();
conn.CreateTableAsync<MyClass4>().Wait();
conn.CreateTableAsync<MyClass5>().Wait();
...
conn.CreateTableAsync<MyClass20>().Wait();

,它似乎不是很表现力(并且不调用Wait())。 我该如何利用模板/功能编程来获得更具表现力和简洁的代码?

编辑:我认为这不是重复的,因为我已经回答了如何在原始问题中调用通用方法,但是我对生成的代码不满意。表达力。

1 个答案:

答案 0 :(得分:1)

您可以通过将结果强制转换为Wait来调用Task

var createMethod = conn.GetType().GetMethod("CreateTableAsync");
Task[] createTasks = bo_types.Select(t => (Task)createMethod.MakeGenericMethod(t).Invoke(conn, null)).ToArray();
Tasks.WaitAll(createTasks);