【问题标题】:How to overload a method that has params object[] as parameter如何重载以 params object[] 作为参数的方法
【发布时间】:2014-11-13 07:51:43
【问题描述】:

我们的数据库在每个存在的表上都定义了一个主键,该表具有一个短键和一个 int 组合键。因此,使用实体框架我们可以尝试通过调用它的Context.DbSet<>.Find(params object[] parameters) 方法来查找元素。 在我们的代码中,这看起来像:

public Client FindClient(short sqlId, int incId)
{
  Context db = new Context();
  Client result = db.Clients.Find(sqlId, incId);
  return result;
}

但是,在我们的代码中,我们使用结构来存储键值。我们的结构如下:

public struct DbKey
{
  private short _SqlId;
  private int _IncId;
  public short SqlId { get { return _SqlId; } }
  public int IncId { get { return _IncId; } }

  public DbKey(short SqlId, int IncId)
  {
    this._SqlId = SqlId;
    this._IncId = IncId;
  }

还有一些其他的比较方法等。 我们希望能够像这样调用 DbSet.Find 方法:

public Client FindClient(DbKey key)
{
  Context db = new Context();
  Client result = db.Clients.Find(key);
  return result;
}

为了能够做到这一点,我们为此方法编写了扩展重载:

public static partial class Extensions
{
  public static T Find<T>(this DbSet<T> dbset, DbKey key) where T : class
  {
    return dbset.Find(key.IncId, key.SqlId);
  }
}

Intellisense 现在告诉我们 Find 方法已重载,一个版本接受 DbKey key 作为参数,而另一个原始方法接受 params object[] parameters。但是,在运行代码时,函数将始终调用原始方法,从不调用重载方法,因为 DbKey 也匹配原始参数,从而导致异常。我们该如何解决这个问题?

【问题讨论】:

  • Closer is better 重命名您的扩展方法。这是我唯一能想到的。或者改为Extensions.Find
  • 这是因为它将您的对象纳入其对象[] 为什么不更改您的扩展名,例如 FindCustom

标签: c# entity-framework-6 overloading dbset


【解决方案1】:

嗯,你可以重命名,或者直接调用静态扩展:

public Client FindClient(DbKey key)
{
  Context db = new Context();
  Client result = Extensions.Find(db.Clients, key);
  return result;
}

【讨论】:

  • 详细说明:如果存在与调用站点匹配的非扩展方法,则扩展方法规则特别忽略扩展方法,即使重载通常更喜欢扩展方法。扩展方法真的不是重载,因为它实际上不在同一类型中。通过强制使用扩展方法类中的非重载方法,显式调用它可以解决歧义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
相关资源
最近更新 更多