首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从字符串表示中获取泛型类型?

如何从字符串表示中获取泛型类型?
EN

Stack Overflow用户
提问于 2009-04-06 15:03:53
回答 5查看 90.5K关注 0票数 80

我有MyClass<T>

然后我就有了这个string s = "MyClass<AnotherClass>";。如何从字符串s获取类型

一种方法(丑陋的)是解析出"<“和">”,然后这样做:

代码语言:javascript
复制
Type acType = Type.GetType("AnotherClass");  
Type whatIwant = typeof (MyClass<>).MakeGenericType(acType);

但是,有没有一种更干净的方法来获得最终的类型,而不需要任何解析,等等?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-04-06 15:36:22

format for generics是名称,一个`字符,类型参数的数量,后面是括号中以逗号分隔的类型列表:

代码语言:javascript
复制
Type.GetType("System.Collections.Generic.IEnumerable`1[System.String]");

我不确定是否有一种简单的方法可以将泛型的C#语法转换为CLR想要的那种字符串。我开始编写一个快速正则表达式来解析它,就像您在问题中提到的那样,但是我意识到,除非您放弃将嵌套泛型作为类型参数的能力,否则解析将变得非常复杂。

票数 96
EN

Stack Overflow用户

发布于 2009-04-06 15:06:52

查看Activator.CreateInstance -您可以使用类型调用它

代码语言:javascript
复制
Activator.CreateInstance(typeof(MyType))

或者使用程序集,类型名称为string

代码语言:javascript
复制
Activator.CreateInstance("myAssembly", "myType")

这将为您提供所需类型的实例。

如果您需要Type而不是实例,请使用Type.GetType()方法和您感兴趣的类型的完全限定名,例如:

代码语言:javascript
复制
string s = "System.Text.StringBuilder";
Type myClassType = Type.GetType(s);

这将为您提供有问题的Type

票数 38
EN

Stack Overflow用户

发布于 2011-02-09 22:00:32

我需要这样的东西,最后我编写了一些代码来解析我需要的简单类型名。当然还有改进的空间,因为它不能识别像List<string>这样的泛型类型名,但它对stringint[]decimal?等很好。分享一下,以防这对任何人都有帮助。

代码语言:javascript
复制
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);
  }
}

使用它就像编写以下代码一样简单:

代码语言:javascript
复制
Type t;

t = TypeExtensions.GetTypeFromSimpleName("string");
t = TypeExtensions.GetTypeFromSimpleName("int[]");
t = TypeExtensions.GetTypeFromSimpleName("decimal?");
票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/721870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档