2013-10-17 105 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調用方法。