有没有办法强制/限制传递给基元的类型? (bool,int,string等)
现在,我知道您可以通过where子句将泛型类型参数限制为类型或接口实现.然而,这不符合基元(AFAIK)的费用,因为它们并非都有共同点(除了某人之前的对象!:P).
所以,我目前的想法只是咬紧牙关并做一个大的switch语句并在失败时抛出ArgumentException.
编辑1:
只是为了澄清:
代码定义应该是:
public class MyClass<GenericType> ....
Run Code Online (Sandbox Code Playgroud)
和实例化:
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!)
Run Code Online (Sandbox Code Playgroud)
编辑2
@Jon Limjap - 好点,我正在考虑的事情......我确信有一个通用的方法可以用来确定类型是值还是引用类型..
这可以用于立即删除我不想处理的很多对象(但是你需要担心使用的结构,比如Size).有趣的问题不是吗?:)
这里是:
where T : struct
Run Code Online (Sandbox Code Playgroud)
取自MSDN.
我很好奇..可以使用扩展方法在.NET 3.x中完成吗?创建一个接口,并在扩展方法中实现接口(这可能比胖胖的开关更干净).此外,如果您稍后需要扩展到任何轻量级自定义类型,它们也可以实现相同的接口,而不需要对基本代码进行任何更改.
你们有什么感想?
可悲的消息是我在Framework 2中工作!! :d
编辑3
从Jon Limjaps Pointer开始,这非常简单.这么简单,我几乎想哭,但它很棒,因为代码就像一个魅力!
所以这就是我所做的(你会笑!):
bool TypeValid()
{ …Run Code Online (Sandbox Code Playgroud) 泛型类中的静态字段将为每个泛型参数组合具有单独的值.因此它可以用作Dictionary <Type,无论 >
这是不是一个静态的字典更好或更坏<类型,无论 >?
换句话说,哪些实现更有效?
public static class MethodGen<TParam> {
public static readonly Action<TParam> Method = CreateMethod();
static Action<TParam> CreateMethod() { /*...*/ }
}
Run Code Online (Sandbox Code Playgroud)
要么,
public static class MethodGen {
static readonly Dictionary<Type, Delegate> methods
= new Dictionary<Type, Delegate>();
public static Action<T> GetMethod<T>() {
//In production code, this would ReaderWriterLock
Delegate method;
if(!methods.TryGetValue(typeof(T), out method)
methods.Add(typeof(t), method = CreateMethod<T>());
return method;
}
static Action<T> CreateMethod<T>() { /*...*/ }
}
Run Code Online (Sandbox Code Playgroud)
特别是,CLR如何通过泛型类型参数查找静态字段?