有没有强制/限制传递给原语的类型的方法? < em > (bool、 int、 string 等)
现在,我知道可以通过 哪里子句将泛型类型参数限制为类型或接口实现。然而,这并不符合原语(AFAIK)的要求,因为它们并不都有一个共同的基础(除了在有人说之前的 对象!校对: P)。
所以,我现在的想法是咬紧牙关,做一个大的 开关语句,在失败的时候抛出一个 异常。
编辑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-说得好,我已经在考虑了。我确信有一个泛型方法可以用来确定类型是值类型还是引用类型。
这对于立即删除许多我不想处理的对象非常有用(但是您需要担心使用的结构,例如 大小)。有趣的问题,不是吗?:)
这就是:
where T: struct
取自 MSDN。
我很好奇。这个可以在。NET 3.x 使用扩展方法?创建一个接口,并在扩展方法中实现该接口(这可能比位胖开关更简单)。另外,如果您以后需要扩展到任何轻量级自定义类型,它们也可以实现相同的接口,不需要对基本代码进行任何更改。
你们觉得怎么样?
坏消息是我在框架2里工作
编辑3
This was so simple following on from Jon Limjaps 指针.. So simple I almost want to cry, but it's great because the code works like a charm!
这就是我所做的(你们会笑的!) :
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.");
}
接下来需要做的就是在类构造函数中调用 EnforcPrimitiveType ()
唯一的缺点是,它只在运行时(显然)而不是在设计时抛出异常。但这没什么大不了的,可以通过像 FxCop这样的实用程序(我们在工作中不使用它)来实现。
特别感谢 Jon Limjap!