1

今天早上我的大脑根本不工作,所以我希望有人能帮我解决这个问题。

我有一个小辅助方法来检查 IEnumerable 是否为空或没有项目。

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 ,这会起作用。

我会很感激有人为我解决这个问题。

4

5 回答 5

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; }
}

返回“通用版本”

于 2013-10-17T08:57:00.813 回答
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");
    }
}
于 2013-10-17T09:07:00.747 回答
0

而不是像您使用的那样使用通用方法,而是使用普通方法:

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

泛型不是必需的。

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

ThrowIfNullOrEmtpy对比ThrowIfNullOrEmpty

于 2013-10-17T08:52:52.157 回答
0

你为什么不试试这个:

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

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

于 2013-10-17T09:01:46.913 回答
0

更改您的方法签名如下:

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

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

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

于 2013-10-17T09:11:06.330 回答