如何动态地将对象类型传递给<>?

时间:2020-03-30 19:48:17

标签: c# mongodb asp.net-core .net-core

我想使用一种方法在集合中创建一个空文档并从MongoDB获取其ID。我正在考虑对2种不同类型的对象类型使用相同的方法。例如:

public async Task<string> CreateObject (object x) 
{ 
  Type objectType = x.GetType();
  _context.Database.
  GetCollection<objectType>("CollectionName").
  InsertOneAsync(x); 

  return x; 

 }

但是这不起作用,因为GetCollection <>仅适用于已在应用程序中定义并且拒绝根据我的代码动态获取对象类型的实体或模型。我不知道它的编程不好,但是有可能做到这一点或者只是愚蠢地尝试一下吗?

谢谢:)

3 个答案:

答案 0 :(得分:1)

不是很清楚您要实现的目标,但是如果您使方法成为通用的方法会怎样

public async Task<string> CreateObject<T> (T x) 
{ 
  _context.Database.
  GetCollection<T>(nameof(T)).InsertOneAsync(x); 
  return x; 
}

答案 1 :(得分:1)

为什么不能使用类似dynamic的类型?

_context.Database.
  GetCollection<dynamic>("CollectionName").
  InsertOneAsync(x); 

或者您也可以使用BsonDocument类。

答案 2 :(得分:0)

如果您只想向集合中添加一个空文档并获取一个ID,数据库服务器为其分配了ID,则可以执行以下操作:

var client = new MongoClient();
var database = client.GetDatabase("test");
await client.DropDatabaseAsync(database.DatabaseNamespace.DatabaseName);
var collection = database.GetCollection<BsonDocument>("collection");

var newDocument = new BsonDocument();
await collection.InsertOneAsync(newDocument);

var id = newDocument["_id"].AsObjectId;

Console.WriteLine($"_id is '{id}'");