最近,我遇到了在泛型方法中使用给定消息创建异常的问题。例如,以下代码按预期工作:
public static void Throw<T>() where T : Exception, new()
{
throw new T();
}
...
public static void Main()
{
Throw<ArgumentOutOfRangeException>(); // Throws desired exception but with a generic message.
}
但是,我希望能够写
public static void Throw<T>(string message) where T : Exception, new()
{
T newException = new T();
newException.Message = message; // Not allowed. 'Message' is read-only.
throw newException;
}
...
public static void Main()
{
Throw<ArgumentOutOfRangeException>("You must specify a non-negative integer."); // Throws desired exception.
}
有没有办法在不使用反射来改变Message
属性的值或用所需参数动态激活类型实例的情况下实现这一目标?
答案 0 :(得分:8)
您可以使用Activator.CreateInstance(typeof(T), "MyException description")
启用自定义消息。
如果不使用反射或使用激活器,则无法创建实例。
http://msdn.microsoft.com/de-de/library/wcxyzt4d(v=vs.80).aspx
答案 1 :(得分:3)
新约束仅对默认(无参数)构造函数有效,请尝试以下方法:
public static void Throw<T>(string message) where T : Exception
{
System.Reflection.ConstructorInfo constructor = typeof(T).GetConstructor(new Type[] { typeof(string) });
T newException = (T)constructor.Invoke(new object[] { message });
throw newException;
}
(请注意,在这种情况下你不需要新约束)