有没有办法为通用实例提供构造函数参数?

时间:2010-09-04 23:32:51

标签: c# .net exception casting

我无法在C#中执行此操作:

    catch (Exception exception)
    {
        var wrappedException = new TException(exception);
    }

获取错误“在创建类型参数'TException'的实例时无法提供参数。只是想与社区核实是否有办法做这样的事情?

2 个答案:

答案 0 :(得分:2)

最简单(也是最好)的方法是自己调用Activator.CreateInstance。这就是C#编译器实际执行的操作,因为new()约束只是确保指定的类型具有无参数构造函数;调用new TException()实际上使用Activator.CreateInstance来实例化类型。

这样的事情会起作用:

throw (Exception)Activator.CreateInstance(typeof(TException), exception);

答案 1 :(得分:1)

我发现最简单的方法是让有问题的类型除了泛型参数之外还要使用工厂lambda。此工厂lambda负责为某些参数创建通用参数的实例。例如

void TheMethod<TException>(Func<Exception,TException> factory) {
  ...
  catch (Exception ex) {
    var wrapped = factory(ex);
    ...
  }
}

我最近写了一篇关于这个问题的博客文章,它解决了这个问题的各种方法