我最近一直在使用通用方法,并遇到了类似这样的方法:
public static void Requires<TException>(bool condition, string message) where TException : Exception
据我了解,在使用上述方法时,您提供的Type
继承自Exception
,如果condition
为false
提供的Exception
类型扔了。
这如何在引擎盖下工作?
TException
是否像throw new TException();
那样实例化了?
如果方法不知道message
,那么如何传递Type
参数(它只知道它继承了类型Exception
)?
答案 0 :(得分:3)
根据MSDN:System.Exception确实有一个构造函数,它接受一个字符串作为参数。此字符串表示消息。
在Activator-Class的帮助下,您可以执行以下操作:
using System;
public class Test
{
public static void Requires<TException>(bool condition, string message)
where TException : Exception
{
Exception exception = (Exception)Activator.CreateInstance(typeof(TException),message);
throw exception;
}
public static void Main()
{
try
{
Requires<ArgumentNullException>(true,"Test");
}
catch(Exception e)
{
Console.WriteLine(e);
}
}
}
工作示例: http://ideone.com/BeHYUO
答案 1 :(得分:2)
据我所知,在使用上述方法时,您提供了一个继承自Exception的Type,如果条件为false,则抛出提供的Exception类型。
这取决于方法的实现,所有它说的是Requires
方法的类型参数必须具有Exception
的基本类型。但如果条件为false
,很可能会创建该类型的异常。一种方法是使用Activator.CreateInstance
方法。
答案 2 :(得分:1)
如果Type未知,如何传递message参数? 方法
与 Ned Stoyanov 的回答类似,由实施该方法的人决定如何使用此参数。它可以用作异常中嵌入的消息,可以在其他地方使用,也可以根本不使用。参数名称仅建议它将用于什么,但调用者无法保证它将按预期使用。它也可以被称为djfhsfjfh
。