我在这里查看了一些类似的问题,并在网络上浏览了几篇文章,但仍未得出一个可靠的结论来解决这个问题。我读过的所有内容似乎都与抛出ArgumentException
或ArgumentOutOfRangeException
之类的东西有关。但是,我不认为这些基于我到目前为止所读的内容。如果它们确实适用于我的情况,您能否解释一下(并提供文档)为什么最合适?
我有一个通用类Foo<T>
,它具有类型T
的属性。类型T
仅在类型Bar
和BarFoo
中之一时才有效。因此,如果T
是无效的类型,则构造函数中将引发异常:
public class Foo<T> {
public T ID { get; private set; }
public Foo(T id) {
if (typeof(T) != typeof(Bar) || typeof(T) != typeof(BarFoo))
throw new Exception("Invalid type message goes here...");
if (id is Bar)
ID = (Bar)(object)id;
else if (id is BarFoo)
ID = (BarFoo)(object)id;
}
}
这是一个简单的示例,但由于在创建对象时指定了T
,因此我不确定在这种情况下应该抛出什么异常:
Foo<int> myFoo = new Foo<int>(3);
在类级别而不是方法级别提供T
的类型时,应该引发什么异常?如果两者都被相同对待,那么请提供关于为何如此的详尽解释。
注意
问题已结案,此后设计也已更改。我建议查看重复的内容或下面的答案。无需进一步评论。
答案 0 :(得分:1)
这里没有合适的异常类型,因为这种情况没有道理。
我会重新考虑您的设计。您声称 Foo
是通用的,但是它只能接受两个假设为正交的类型之一。如果Bar
和BarFoo
之间没有通用的基本类型或接口,那么 Foo
如何通用 ?
您对ID
做些什么,它们可以应用于Bar
或BarFoo
(但无其他事项)而不会产生反射或产生大量开关,具体取决于类型?
您可以尝试创建具有具体实现的abstract
泛型类型:
public abstract Foo<T> {
}
public FooBar : Foo<Bar> {
}
public FooBarFoo : Foo<BarFoo> {
}
但是没有什么可以阻止某人实现使用除Bar
或BarFoo
之外的其他类型的另一类型。但是至少没有一种 easy 方式可以使用其他类型。