我有MyClass<T>
。
然后我就有了这个string s = "MyClass<AnotherClass>";
。如何从字符串s
获取类型
一种方法(丑陋的)是解析出"<“和">”,然后这样做:
Type acType = Type.GetType("AnotherClass");
Type whatIwant = typeof (MyClass<>).MakeGenericType(acType);
但是,有没有一种更干净的方法来获得最终的类型,而不需要任何解析,等等?
发布于 2009-04-06 15:36:22
format for generics是名称,一个`字符,类型参数的数量,后面是括号中以逗号分隔的类型列表:
Type.GetType("System.Collections.Generic.IEnumerable`1[System.String]");
我不确定是否有一种简单的方法可以将泛型的C#语法转换为CLR想要的那种字符串。我开始编写一个快速正则表达式来解析它,就像您在问题中提到的那样,但是我意识到,除非您放弃将嵌套泛型作为类型参数的能力,否则解析将变得非常复杂。
发布于 2009-04-06 15:06:52
查看Activator.CreateInstance
-您可以使用类型调用它
Activator.CreateInstance(typeof(MyType))
或者使用程序集,类型名称为string
Activator.CreateInstance("myAssembly", "myType")
这将为您提供所需类型的实例。
如果您需要Type
而不是实例,请使用Type.GetType()
方法和您感兴趣的类型的完全限定名,例如:
string s = "System.Text.StringBuilder";
Type myClassType = Type.GetType(s);
这将为您提供有问题的Type
。
发布于 2011-02-09 22:00:32
我需要这样的东西,最后我编写了一些代码来解析我需要的简单类型名。当然还有改进的空间,因为它不能识别像List<string>
这样的泛型类型名,但它对string
、int[]
、decimal?
等很好。分享一下,以防这对任何人都有帮助。
public static class TypeExtensions
{
public static Type GetTypeFromSimpleName(string typeName)
{
if (typeName == null)
throw new ArgumentNullException("typeName");
bool isArray = false, isNullable = false;
if (typeName.IndexOf("[]") != -1)
{
isArray = true;
typeName = typeName.Remove(typeName.IndexOf("[]"), 2);
}
if (typeName.IndexOf("?") != -1)
{
isNullable = true;
typeName = typeName.Remove(typeName.IndexOf("?"), 1);
}
typeName = typeName.ToLower();
string parsedTypeName = null;
switch (typeName)
{
case "bool":
case "boolean":
parsedTypeName = "System.Boolean";
break;
case "byte":
parsedTypeName = "System.Byte";
break;
case "char":
parsedTypeName = "System.Char";
break;
case "datetime":
parsedTypeName = "System.DateTime";
break;
case "datetimeoffset":
parsedTypeName = "System.DateTimeOffset";
break;
case "decimal":
parsedTypeName = "System.Decimal";
break;
case "double":
parsedTypeName = "System.Double";
break;
case "float":
parsedTypeName = "System.Single";
break;
case "int16":
case "short":
parsedTypeName = "System.Int16";
break;
case "int32":
case "int":
parsedTypeName = "System.Int32";
break;
case "int64":
case "long":
parsedTypeName = "System.Int64";
break;
case "object":
parsedTypeName = "System.Object";
break;
case "sbyte":
parsedTypeName = "System.SByte";
break;
case "string":
parsedTypeName = "System.String";
break;
case "timespan":
parsedTypeName = "System.TimeSpan";
break;
case "uint16":
case "ushort":
parsedTypeName = "System.UInt16";
break;
case "uint32":
case "uint":
parsedTypeName = "System.UInt32";
break;
case "uint64":
case "ulong":
parsedTypeName = "System.UInt64";
break;
}
if (parsedTypeName != null)
{
if (isArray)
parsedTypeName = parsedTypeName + "[]";
if (isNullable)
parsedTypeName = String.Concat("System.Nullable`1[", parsedTypeName, "]");
}
else
parsedTypeName = typeName;
// Expected to throw an exception in case the type has not been recognized.
return Type.GetType(parsedTypeName);
}
}
使用它就像编写以下代码一样简单:
Type t;
t = TypeExtensions.GetTypeFromSimpleName("string");
t = TypeExtensions.GetTypeFromSimpleName("int[]");
t = TypeExtensions.GetTypeFromSimpleName("decimal?");
https://stackoverflow.com/questions/721870
复制相似问题