我知道我可以从字符串名称中获得一个类型,比如
Type intType = Type.GetType("System.Int32");
但是,如果我有这样的字符串呢
string[] typeNameArr = new string[] {"Int", "String", "DateTime", "Bool"};
如何将这些转换为实际类型?也许我可以从别名中获得完全限定名,然后执行GetType
?
如果使用完全限定的名称,如"System.Int32"
,则最终可以通过linq:访问它
var types = typeNameArr.Select(c => Type.GetType(c));
此外:如果您的web服务提供自定义名称,则需要映射或约定。例如:
var types = typeNameArr.Select(c => Type.GetType("System." + c));
或
var types = typeNameArr.Select(c =>
{
switch (c)
{
"Int":
return typeof(int);
"Foo":
return typeof(BarClass);
default:
return null
}
});
要获得所有带有别名的基元类型,可以编写:
string assemblyFullName = "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
var assembly = Assembly.Load(assemblyFullName);
var primitiveTypes =
assembly.DefinedTypes.Where(definedType => definedType.IsPrimitive && definedType != typeof(IntPtr) && definedType != typeof(UIntPtr));
using (var provider = new CSharpCodeProvider())
{
var result = primitiveTypes.Select(x => (Alias: provider.GetTypeOutput(new CodeTypeReference(x)), Type: x));
}
将导致:
bool typeof(Boolean)
byte typeof(Byte)
char typeof(Char)
double typeof(Double)
short typeof(Int16)
int typeof(Int32)
long typeof(Int64)
sbyte typeof(SByte)
float typeof(Single)
ushort typeof(UInt16)
uint typeof(UInt32)
ulong typeof(UInt64)