【问题标题】:How to access a property of a generic class in C#? [duplicate]如何在 C# 中访问泛型类的属性? [复制]
【发布时间】:2021-07-02 20:00:41
【问题描述】:

我正在创建一个连接到 Mongo 数据库的 API。

在创建更新集合的某些字段的存储库的方法之后,我想也许我可以重构代码,因为以下结构重复了很多次:

var filter = Builders<Server>.Filter.Eq(x => x.Id, objectUpdated.Id);
var update = Builders<Server>.Update.Set(x=> x.SomeProperty, objectUpdated.SomeProperty);

我想过创建一个有点像这样的方法:

public static void Update<T>(ObjectId id, Property property)
{
  var filter = Builders<T>.Filter.Eq(x => x.Id, id);
  var update = Builders<T>.Update.Set(x=> x.property, property);
}

但是我不知道如何将属性作为参数以及如何比较过滤器中的Id属性,因为我正在处理一个泛型类,所以我会得到以下错误:

CS1061:“T”不包含“Id”的定义且不可访问 接受“T”类型的第一个参数的扩展方法“Id”可以是 找到(您是否缺少 using 指令或程序集引用?)

【问题讨论】:

    标签: c# generics


    【解决方案1】:

    您需要将constrain T 设置为具有Id 属性的某些类型。通常它是通过接口完成的。例如这样的:

    public interface IHaveId
    {
        public int Id { get; set; }
    }
    
    public static void Update<T>(ObjectId id, Property property) where T : IHaveId
    {
      var filter = Builders<T>.Filter.Eq(x => x.Id, objectUpdated.Id);
      var update = Builders<T>.Update.Set(x=> x.property, objectUpdated.property);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多