有没有一种方法可以转换;int";在c#中输入(int)的类型?
我知道我可以像这样从字符串名中获取类型有没有一种方法可以转换;int";在c#中输入(int)的类型?,c#,C#,我知道我可以像这样从字符串名中获取类型 Type intType=Type.GetType(“System.Int32”); 但是,如果我有这样的绳子呢 string[]typeNameArr=新字符串[]{“Int”、“string”、“DateTime”、“Bool”}; 如何将这些转换为实际类型?也许我可以从别名中获取完全限定名,然后执行GetType?如果您使用完全限定名,例如“System.Int32”,最后您可以通过linq访问它: var types = typeNameArr
Type intType=Type.GetType(“System.Int32”);
但是,如果我有这样的绳子呢
string[]typeNameArr=新字符串[]{“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));
或
要使用别名获取所有基元类型,可以编写:
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)
你的字符串数组是奇数
Int
需要变成Int
或System.Int32
,而DateTime
需要变成System.DateTime
(没有DateTime语言别名)。我想你必须对其中的一些进行特殊处理--查找一下,了解Int
等,然后试着预先设置系统。
对于那些不在你的lookupSounds中的,比如你基本上想要一本字典的,把你从web服务知道的每一种类型都添加到字典中。另外,基于反序列化数据实例化任意类型是一个巨大的安全漏洞。BCL中隐藏着一些类型,这些类型在实例化时会执行任意操作,攻击者可以利用这些类型执行远程代码执行。您必须将任何类型的对象创建白名单到已知的安全类型no。别名是一个C语言概念,但类型是由运行时提供的,用于所有CLR语言。您的类型确实有那么多变化吗?仅仅编写字典比摆弄反射要快。我从Web服务获取这个数组,所以我不能在这里使用完全限定名。我需要一种动态的方法来正确地将它们转换为实际的c类型。@Talha:但是Int
既不是.NET类型(即System.Int32
),也不是c别名(即Int
加小写的I
)!因此,恐怕您必须自己硬编码一个转换表(例如,使用一个大的switch语句)。@Talha:由于转换表很短而且不太可能更改,因此我肯定会支持一个大的,硬编码的switch
语句,而不是使用一些框架魔法。此时,您不妨执行从string
到Type
的映射:c switch{“Int”=>typeof(Int),…}
@canton7:很好地捕获如何处理DateTime
?为什么要回答这个问题,而不仅仅是关于或的评论?只需为其添加一个手动映射。为所有类型添加手动映射可能是最好的解决方案,只是想说明也可以使用代码来完成。
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)