当我试图获得值的类型时,为什么我不能在集合属性中使用值字?
set
{
Type t = value.GetType();
if (dictionaries[int.Parse(value.GetType().ToString())] == null)
{
dictionaries[int.Parse(value.GetType().ToString())] = new Dictionary<string,t>();
}
}
它不识别我的Dictionary构造函数中的单词t。我做错了什么?我怎么解决它?
不能使用类型的值或名称作为泛型类型参数。使用带有泛型类型参数的方法:
void SetDict<T>(T value)
{
Type t = typeof(T);
if (dictionaries[t.FullName] == null)
{
dictionaries[t.FullName] = new Dictionary<string,T>();
}
}
除了使用类型名称,还可以直接使用Type
值作为字典的键:
Dictionary<Type, Dictionary<string,T>> dictionaries;
可以在不指定泛型类型参数的情况下调用它,因为编译器可以推断出类型。但是,这只适用于静态类型,不适用于运行时类型。也就是说,你必须使用正确类型的表达式来调用方法,而不能使用像object
这样的基类型。
SetDict("hello"); // ==> string type
SetDict(42); // ==> int type
object obj = "world";
SetDict(obj); // ==> object type, not string type!
注意:泛型类型参数允许您在编译时创建强类型专门化类型和方法。强类型的优点在于编译器和IDE可以为您提供有关类型的信息,并证明您的代码在编译时是静态正确的。在运行时创建泛型类型没有任何优势,因为您将无法在编译时(或者设计时,如果您愿意的话)使用它的优势。您也可以使用Dictionary<string, object>
或类似的。
请参阅我在代码审查上的回答:各种类型的类型安全字典。尤其是我对答案的更新
在声明泛型类型时不能使用Type
变量,必须使用实际类型
换句话说,这行不通:
Type t = ....
var x = new Dictionary<string, t>();
根据你的类,你可以这样做:
public class Something<T>
{
public T Value
{
...
set
{
... new Dictionary<string, T>();
}
}
}
但这并不完全相同。
你还有一个不同的问题,这个:
int.Parse(value.GetType().ToString())
不能工作
value.GetType().ToString()
可能会产生类似System.Int32
或YourAssembly.NameSpace.SomeType
的东西,而不是一个可以被解析的数字。
我认为你需要退后一步,弄清楚你想要完成的是什么。