2013-10-17 76 views
1

今天早上我的大脑根本没有工作,所以我希望有人能为我解决这个问题。IList <string>传递给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方法我得到一个异常验证财产损失。

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,这是可行的。

我希望有人帮我清理一下。

+1

如果它是代码的复制/粘贴,可能是因为第一个函数被称为'ThrowIfNullOrEmtpy',而不是'ThrowIfNullOrEmpty'。 – SWeko

+0

你确定吗?我们不能再现问题 –

+0

@Sekeko;你是对的。这是一个错字。你想创建和回答的点 –

回答

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

回报“通用版”

+2

谢谢......刘海缓缓地对着办公桌:-) –

+2

@PhilMurray,为什么要用两种方法?字符串也实现'IEnumerable'(和IEnumerable )! –

0

而不是使用一个通用的方法,就像你用,你一个正常的方法:

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

通用是没有必要的。

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

ThrowIfNullOrEmtpy VS ThrowIfNullOrEmpty

+0

我已经改变了它,但它仍然不会编译相同的例外 –

+1

@PhilMurray您是否尝试修复拼写? – SynerCoder

0

你为什么不试试这个:

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

正如上面提到的,你将有你的第一个方法名称是一个错误。

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"); 
    } 
} 
0

如下更改方法签名:

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

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

你两个方法有一个小错字,这是什么很可能造成混乱。这种方式你应该用enumerable调用方法。