如果使用无效的泛型类型,我应该抛出异常吗?如果是,是哪一个?

时间:2014-08-13 14:18:04

标签: c# exception generics

我正在构建一个简单的自定义轻量级 csv 生成器类,奇怪的是,CsvWriter<T>

此类的工作方式是,它将自动从所有公共属性生成 csv 到基础Stream,这些公共属性标记有我们恰当地命名为{{1}的预定义属性}。

在创建对象时,我想检查泛型类型是否实现了至少一个具有预定义CsvPropertyAttribute的公共属性。如果那不是&#39;我希望抛出异常,因为泛型类型参数不是真正有效。

出现的问题如下:

  1. 在构造函数中抛出异常是否可以?如果不是解决方案很简单:我可以将有效属性的搜索推迟到第一次调用CsvPropertyAttribute或类似的mehtod(延迟初始化)。
  2. 是否可以抛出泛型类型参数引起的异常?或者将生成的WriteLine(T record)留空是否更好?我无法将泛型参数约束为有效类型。
  3. 最后,如果回答第2个问题是肯定的,我应该使用什么例外? csv似乎更合适,但仍然不太正确。
  4. 谢谢。

2 个答案:

答案 0 :(得分:2)

您甚至可以从类构造函数(又名static constructor)中抛出异常。这样,您每T只能进行一次检查/初始化。

如果类构造函数对CsvWriter<Foo>失败,则您甚至无法调用CsvWriter<Foo>的构造函数。

如果您担心正确的参数输入,可以创建自定义异常类型。这是最干净的解决方案。但是我不会那么担心,因为如果你使用类构造函数,你的异常将以TypeInitializationException的方式包装。

答案 1 :(得分:1)

这实际上应该是编译时错误,但语言并不支持它。

1:是的,继续并投入构造函数。这种快速失败的技术将使您运输错误代码的可能性降低。

2:尽快投掷。不要创建文件。

3:我创建了InvalidOperationException的子类。你可能会想到更好的东西。

另外,我强烈建议不仅要为这个类编写单元测试,还要为任何其他实例化它的代码编写单元测试。

您可能还想重新考虑您的设计。也许是一个界面,为您提供基础知识。