Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种方法可以转换;int";在c#中输入(int)的类型?_C# - Fatal编程技术网

有没有一种方法可以转换;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)