我的大脑今天早上一直没有工作,所以我希望有人可以为我解决这个问题。
我有一个小帮助方法,检查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,这可行。
我很感激有人为我清理这个。
答案 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)
{
}
}
你的两种方法有一个小错字,这可能是造成混乱的原因。这样你应该用可枚举的方法调用该方法。