通用类型例外

时间:2012-01-10 10:44:09

标签: c# generics .net-3.5

最近,我遇到了在泛型方法中使用给定消息创建异常的问题。例如,以下代码按预期工作:

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属性的值或用所需参数动态激活类型实例的情况下实现这一目标?

2 个答案:

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

(请注意,在这种情况下你不需要新约束)