C# 有没有办法向泛型实例提供构造函数参数?

C# 有没有办法向泛型实例提供构造函数参数?,c#,.net,exception,casting,C#,.net,Exception,Casting,我不能用C做这个: Getting error“在创建类型参数“TException”的实例时无法提供参数。只想与社区一起检查是否有任何方法可以执行类似操作?最简单(也是最好的)方法是自己调用Activator.CreateInstance。这是C#编译器实际执行的操作,因为new()约束只确保指定的类型具有无参数构造函数;调用new TException()实际上使用Activator.CreateInstance来实例化类型 类似这样的方法会奏效: throw (Exception)Acti

我不能用C做这个:

Getting error“在创建类型参数“TException”的实例时无法提供参数。只想与社区一起检查是否有任何方法可以执行类似操作?

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

类似这样的方法会奏效:

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

我发现实现这一点的最简单方法是,除了泛型参数之外,让所讨论的类型采用工厂lambda。此工厂lambda负责为某些参数创建泛型参数的实例。例如

void TheMethod<TException>(Func<Exception,TException> factory) {
  ...
  catch (Exception ex) {
    var wrapped = factory(ex);
    ...
  }
}
void方法(函数工厂){
...
捕获(例外情况除外){
var=工厂(出厂价);
...
}
}
我最近还写了一篇关于这个问题的博客文章,讨论了解决这个问题的各种方法


+1很有趣,感谢您提供C#编译器的工作背景。
void TheMethod<TException>(Func<Exception,TException> factory) {
  ...
  catch (Exception ex) {
    var wrapped = factory(ex);
    ...
  }
}