IList <string>传递给IEnumerable参数</string>

时间:2013-10-17 08:48:05

标签: c# .net list generics ienumerable

我的大脑今天早上一直没有工作,所以我希望有人可以为我解决这个问题。

我有一个小帮助方法,检查IEnumerable是否为null或没有项目。

public static class ParameterGuard
{
    public static void ThrowIfNullOrEmtpy<T>(T enumerable, string argName) where T : IEnumerable
    {
        if (enumerable == null)
            throw new ArgumentNullException(argName);
        if (enumerable.HasCountOf(0))
            throw new ArgumentException(Resources.ExceptionEnumerableEmpty, argName);
    }

    public static void ThrowIfNullOrEmpty(string arg, string argName)
    {
        if (arg == null) 
            throw new ArgumentNullException(argName);
        if (arg.Length == 0) 
            throw new ArgumentException(Resources.ExceptionStringEmpty, argName);
    }
}

我还有一个用于发送电子邮件的小型数据结构

public class EmailOptions
{
    public string Server { get; set; }
    public int Port { get; set; }
    public string From { get; set; }
    public List<string> To { get; set; }
    public List<string> Cc { get; set; }
    public string Subject { get; set; }
    public string Body { get; set; }
    public bool IsHtml { get; set; }

}

当我尝试使用ThrowIfNullOrEmpty方法验证To属性时,我得到一个异常。

  private MailMessage CreateEmail(EmailOptions options)
  {
        ParameterGuard.ThrowIfNullOrEmpty(options.To, "To");
        ...
  }

异常

The best overloaded method match for 
ParameterGuard.ThrowIfNullOrEmpty(string, string)' has some invalid arguments

我原以为,IList<>类实现了IEnumerable,这可行。

我很感激有人为我清理这个。

5 个答案:

答案 0 :(得分:1)

我已经尝试了代码,如果两种方法确实都是重载,那么通用版本就会被正确使用。

在粘贴的代码中,第一个函数名为ThrowIfNullOrEmtpy,而不是ThrowIfNullOrEmpty,因此这是一个简单的拼写错误。


这个LINQPad代码:

void Main()
{
  CreateEmail(new EmailOptions());
}

private void CreateEmail(EmailOptions options)
{
  ParameterGuard.ThrowIfNullOrEmpty(options.To, "To");
}

public static class ParameterGuard
{
      public static void ThrowIfNullOrEmpty<T>(T enumerable, string argName) 
        where T : IEnumerable
      {
          Console.Write("Generic Version");
      }

      public static void ThrowIfNullOrEmpty(string arg, string argName)
      {
          Console.Write("String Version");
      }
}

public class EmailOptions
{
    public List<string> To { get; set; }
}

返回“通用版本”

答案 1 :(得分:0)

您可以使用常规方法,而不是使用您使用的通用方法:

public static void ThrowIfNullOrEmtpy(IEnumerable enumerable, string argName);

通用没有必要。

其次。这些方法有不同的名称。这可能只是一个错字:

ThrowIfNullOrEmtpy vs ThrowIfNullOrEmpty

答案 2 :(得分:0)

你为什么不试试这个:

public static void ThrowIfNullOrEmpty<T>(IEnumerable<T> enumerable, string argName)
{
    ...
}

如上所述,您在第一个方法名称中会出错。

答案 3 :(得分:0)

string也实现IEnumerable,您只能使用一种方法:

public static class ParameterGuard
{
    public static void ThrowIfNullOrEmpty<T>(IEnumerable<T> enumerable, string argName)
    {
        if (enumerable == null)
            throw new ArgumentNullException(argName);
        if (!enumerable.Any())
            throw new ArgumentException();
    }
}

public class Program
{

    static void Main(string[] args)
    {
        List<string> list = new List<string>();
        list.Add("test");
        ParameterGuard.ThrowIfNullOrEmpty(list, "list");
        ParameterGuard.ThrowIfNullOrEmpty("string", "str");
    }
}

答案 4 :(得分:0)

按如下方式更改方法签名:

public static class ParameterGuard
{
    public static void ThrowIfNullOrEmpty(IEnumerable enumerable, string argName)
    {
    }

    public static void ThrowIfNullOrEmpty(string arg, string argName)
    {
    }
}

你的两种方法有一个小错字,这可能是造成混乱的原因。这样你应该用可枚举的方法调用该方法。