如何使用Activator.CreateInstance来执行以下操作

时间:2014-06-13 09:05:43

标签: activator

我在我的应用程序中多次使用类似的代码样式来读取数据库中的记录

WorkoutResultsRecord继承自名为BaseRecord的类。其中一个基础构造函数使用IDataReader参数将字段读入类中(如下所示)。

我想要做的是定义一个泛型函数,它将对我的所有60+ xxxRecord类型类执行以下操作,即我可以传入一个类型作为参数,它将返回正确类型的对象作为键入列表。是否可以使用Activator类?我之前没有使用它,我的结果也不会编译

protected List<WorkoutResultsRecord> ReadRecordList(string sql, 
  IDbConnection connection)
{
  var results = new List<WorkoutResultsRecord>();
  using (IDbCommand command = GetCommand(sql, connection))
    using (IDataReader reader = command.ExecuteReader())
      while (reader.Read())
        results.Add(new WorkoutResultsRecord(reader));
  return results;
}

我真的很糟糕,尝试失败:(

private void sfsdf(Type type)
{
  List<typeof(type)> lst = new List<type>();
  Activator.CreateInstance(List<typeof(type)>);
}// function

2 个答案:

答案 0 :(得分:1)

这应该有效:

    private void sfsdf(Type type)
    {
        Type genericType = typeof(List<>).MakeGenericType(type);
        System.Collections.IList theList = (IList) Activator.CreateInstance(genericType);
        // do whatever you like with this list...
    }

注意:由于类型仅在运行时已知,因此在编写代码时不可能声明List,因此请使用IList接口,但创建的对象theList应为预期类型。

答案 1 :(得分:0)

以下是我想要的所有泛型完整功能。这将节省大量的打字!非常感谢

allResults = (List<WorkoutResultsRecord>)FillList(typeof(WorkoutResultsRecord), 
  sql, connection, new KVP("FROMDATE", fromUtf.Date),
      new KVP("TODATE", endDate.AddDays(1).Date));

IList FillList(Type type,string sql,IDbConnection connection,
  params KVP[] parameters)
{
  Type genericType = typeof(List<>).MakeGenericType(type);
  IList results = (IList)Activator.CreateInstance(genericType);

  using (var command= Command(sql,connection))
  {
    foreach(KVP parameter in parameters)
      CreateParam(command,parameter.Key,parameter.Value);
    using (IDataReader reader = command.ExecuteReader())
      while (reader.Read())
        results.Add(Activator.CreateInstance(type,reader));
  }
  return results;
}