2013-10-17 2 views
1

내 머리가 오늘 아침에 작동하지 않으므로 다른 사람이 나에게 이것을 정리해주기를 바랍니다.IList <string>이 IEnumerable 매개 변수에 전달되었습니다.

IEnumerable이 null인지 항목이 없는지 확인하는 약간의 도우미 메서드가 있습니다. 나는 예외를 얻을 ThrowIfNullOrEmpty 방법을 사용하여 특성에 유효성을 검사 할 때

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

} 

에 대한 작은 데이터 구조를 가지고있다.

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

@SWeko; 네가 옳아. 오타입니다. 이 질문에 대한 답변을 작성 하시겠습니까? –

답변

1

ThrowIfNullOrEmpty 대 내가 코드를 시도했습니다, 그리고 두 가지 방법이 실제로 과부하 경우, 일반 버전 (제대로)를 사용합니다.

붙여 넣은 코드에서 첫 번째 함수는 ThrowIfNullOrEmpty이 아니라 ThrowIfNullOrEmtpy이므로 간단한 맞춤법 오류입니다.


이 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

+0

위와 같이 변경했지만 여전히 같은 예외로 컴파일하지 않습니다. –

+1

@PhilMurray 맞춤법을 고치려고 했습니까? – SynerCoder

0

왜 당신이 시도하지 않는 :

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

당신이해야합니다 위에서 언급 한 바와 같이 당신의 실수로 첫번째 방법 이름. 다음과 같이

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

string 또한 하나의 방법을 사용할 수 있습니다, IEnumerable 구현

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

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

당신의 두 가지 방법이 작은 오타가 있었다 그것은 아마도 무슨이다 혼란의 원인이됩니다.이 방법은 당신이 열거 형과 함께 메서드를 호출해야합니다.

0
당신의 방법 서명을 변경

:

관련 문제