繁体   English   中英

如何重载以params object []作为参数的方法

[英]How to overload a method that has params object[] as parameter

我们的数据库在包含短键和整数键的组合键的每个表上定义了主键。 因此,使用实体框架,我们可以尝试通过调用其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也与原始参数匹配,从而导致异常。 我们如何解决这个问题?

好了,您可以重命名或直接调用静态扩展:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM