有没有一种方法可以强制/限制传递给基元的类型? (布尔,整数,字符串等)
现在,我知道您可以通过where子句将泛型类型参数限制为类型或接口实现。但是,这并不适合基元(AFAIK),因为它们并不具有共同点(除了对象之前有人说过!:P)。
因此,我目前的想法是咬紧牙关,做一个大的switch语句,并在失败时抛出ArgumentException。
编辑1:
只是澄清一下:
代码定义应类似于:
public class MyClass<GenericType> ....
和实例化:
MyClass<bool> = new MyClass<bool>(); // Legal
MyClass<string> = new MyClass<string>(); // Legal
MyClass<DataSet> = new MyClass<DataSet>(); // Illegal
MyClass<RobsFunkyHat> = new MyClass<RobsFunkyHat>(); // Illegal (but looks awesome!)
编辑2
@Jon Limjap-好点了,我已经考虑过了。.我确定有一种通用方法可以用来确定类型是值类型还是引用类型。
这在立即删除许多我不想处理的对象时可能很有用(但是您需要担心所使用的结构,例如Size)。有趣的问题不是吗?:)
这里是:
where T : struct
取自MSDN。
我很好奇..这可以在.NET 3.x中使用扩展方法来完成吗?创建一个接口,并在扩展方法中实现该接口(这可能比使用胖开关更干净)。另外,如果您随后需要扩展到任何轻量级定制类型,则它们也可以实现相同的接口,而无需更改基本代码。
你们有什么感想?
不幸的消息是我正在Framework 2中工作!!:D
编辑3
这是从Jon Limjaps Pointer开始的非常简单的步骤。.非常简单,我几乎想哭了,但这很棒,因为代码像一个魅力一样起作用!
所以这就是我所做的(你会笑!):
将代码添加到泛型类
bool TypeValid()
{
// Get the TypeCode from the Primitive Type
TypeCode code = Type.GetTypeCode(typeof(PrimitiveDataType));
// All of the TypeCode Enumeration refer Primitive Types
// with the exception of Object and Empty (Null).
// Since I am willing to allow Null Types (at this time)
// all we need to check for is Object!
switch (code)
{
case TypeCode.Object:
return false;
default:
return true;
}
}
然后是一个小的实用程序方法来检查类型并引发异常,
private void EnforcePrimitiveType()
{
if (!TypeValid())
throw new InvalidOperationException(
"Unable to Instantiate SimpleMetadata based on the Generic Type of '" + typeof(PrimitiveDataType).Name +
"' - this Class is Designed to Work with Primitive Data Types Only.");
}
接下来要做的就是在类构造函数中调用EnforcePrimitiveType()。任务完成!:-)
唯一的缺点是,它只会在运行时(显然)而不是设计时抛出异常。.但这没什么大不了的,可以通过FxCop之类的实用程序(我们在工作中不使用)来解决。
特别感谢乔恩·林贾普(Jon Limjap)!