基于类型参数实例化新对象

本文关键字:对象 新对象 类型参数 实例化 | 更新日期: 2023-09-27 18:14:50

我试图根据传递给方法的异常类型参数抛出异常。

这是目前为止我所拥有的,但我不想指定每种异常:

public void ThrowException<T>(string message = "") where T : SystemException, new()
    {
        if (ConditionMet)
        {
            if(typeof(T) is NullReferenceException)
                throw new NullReferenceException(message);
            if (typeof(T) is FileNotFoundException)
                throw new FileNotFoundException(message);
            throw new SystemException(message);
        }
    }

理想情况下,我想做一些类似new T(message)的事情,因为我有一个基本类型SystemException,我认为这是可能的。

基于类型参数实例化新对象

我不认为您可以单独使用gerics做到这一点。您需要使用反射。比如:

throw (T)Activator.CreateInstance(typeof(T),message);

正如其他人所说,这只能通过反射来完成。但是您可以去掉类型参数,并将实例化的异常传递给函数:

public void ThrowException(Exception e)
{
    if (ConditionMet)
    {
        if(e is NullReferenceException || e is FileNotFoundException)
        {
            throw e;
        }
        throw new SystemException(e.Message);
    }
}

用法:

// throws a NullReferenceException
ThrowException(new NullReferenceException("message"));
// throws a SystemException
ThrowException(new NotSupportedException("message"));

可以使用

Activator.CreateInstance(typeof(T),message);

更多信息请访问http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx