【问题标题】:How to pass one or other list into a function如何将一个或其他列表传递给函数
【发布时间】:2014-06-16 17:32:24
【问题描述】:

我想知道是否有人可以帮助我,我在 C# 中有两个List T,除了一个持有客户和一个持有供应商之外,它们是相同的。我试图将这些列表中的每一个都传递给一个函数,但没有成功,以避免有额外的代码。

在下面创建的列表:

var customers = IntuitServiceConfig.ServiceManager.FindAll<Customer>(new Customer(), 1, 500);
var vendor = IntuitServiceConfig.ServiceManager.FindAll<Vendor>(new Vendor(), 1, 500);

我想传入下面的函数:

public static string Contacts(AppContext ctx, List<Type1> list )
{
   foreach (var contact in list)
   {
    // do some db work
   }
} 

【问题讨论】:

  • 听起来这两个列表根本不一样——它们包含根本不同的对象。

标签: c# function intuit-partner-platform quickbooks-online intuit


【解决方案1】:

如果您希望/可以对两个类使用相同的代码(CustomerVendor),请将您的 Contacts 函数更改为通用

public static string Contacts<TContact>(AppContext ctx, List<TContact> list )
{
    foreach (var contact in list)
    {
        // do some db work
    }
}

然后像这样使用:

List<Customer> customers = IntuitServiceConfig.ServiceManager.FindAll(new Customer(), 1, 500).ToList();
List<Vendor> vendors = IntuitServiceConfig.ServiceManager.FindAll(new Vendor(), 1, 500).ToList();

String cust = Contacts<Customer>(ctx, customers);
String vend = Contacts<Vendor>(ctx, vendors);

更新
如果您的 VendorCustomer 类不同,不是从同一个基类派生或没有实现相同的接口,那么您需要为每个类编写自己的函数

public static string Contacts(AppContext ctx, List<Customer> list )
{
    foreach (var contact in list)
    {
        // do some db work with customers
    }
}

public static string Contacts(AppContext ctx, List<Vendor> list )
{
    foreach (var contact in list)
    {
        // do some db work with vendors
    }
}

并使用:

String cust = Contacts(ctx, customers);
String vend = Contacts(ctx, vendors);

【讨论】:

  • 错误 1 ​​'TContact' 不包含 'Id' 的定义,并且找不到接受类型为 'TContact' 的第一个参数的扩展方法 'Id'(您是否缺少 using 指令或程序集参考?)
  • @JimboJones,显示您的代码如何调用Contact&lt;TContact&gt; 函数。我更新了答案,为不同类型重载了相同的函数。另一方面,@Andrew Cooper 的答案似乎更好,如果你想让所有的功能都保持相同
【解决方案2】:

您可以尝试将方法设为通用:

public static string Contacts<TElement>(AppContext ctx, List<TElement> list )
{
  foreach (TElement element in list)
  {
    // do some db work
  }
}

更新

您需要让两个对象实现相同的接口(或者,从相同的基类派生)。你可以像这样创建一个IContact 接口:

interface IContact 
{
    int Id { get; set; }
    // other common properites
}

...像这样修改联系人类:

class Customer : IContact
{
    // rest of Customer definition
}

class Vendor : IContact
{
    // rest of Vendor definition
}

...然后像这样改变方法:

public static string Contacts<TContact>(AppContext ctx, List<TContact> list )
    where TContact : IContact
{
  foreach (TContact element in list)
  {
    // do some db work
  }
}

...或者只是:

public static string Contacts(AppContext ctx, List<IContact> list )
{
  foreach (IContact element in list)
  {
    // do some db work
  }
}

【讨论】:

  • 错误 1 ​​'TElement' 不包含 'Id' 的定义,并且找不到接受“TElement”类型的第一个参数的扩展方法 'Id'(您是否缺少 using 指令或程序集参考?)字符串 ContactId = element.Id.ToString();
  • @JimboJones - 您需要定义一个接口来指定您想要对列表元素执行的常见操作。要么,要么让CustomerVendor 派生自同一个基类。然后,您可以向该方法添加类型说明符。
【解决方案3】:

如果CustomerVendor 都继承自同一个基类,并且您实际上不需要在函数中更改列表本身,则可以尝试在函数签名中使用IEnumerable

public static string Contacts(AppContext ctx, IEnumerable<BaseClass> list )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 2013-02-15
    • 2020-06-27
    • 2012-03-07
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多