2017-02-23 30 views
-1

CompactFramework,我得到了TypeString它可以是一个复杂的,这意味着它可以使用泛型,数组,等等。这意味着它可以像Sytem.Tuple’1[[Sytem.String, mscorlib]]。问题是,我不能使用Type.GetType,因为Typestring中的assemblys可能是错误的或不存在。 是否有解析字符串的lib,并且通过搜索appdomain中的所有类型为正确的类型返回一个类型?解析来自一个字符串类型名复用C#

+0

这是行不通的。大会名称可能是错误的 –

+0

如果你看起来确切,Type.parse是在JavaScript中 –

回答

0

我现在才发现没有代码,但使用这种解决:

public static class TypeHelper 
{ 
    public static Type GetTypeFromString(string typeString) 
    { 
     int pos = 0; 
     return ParseInternal(typeString, ref pos); 
    } 

    private static Type ParseInternal(string name, ref int pos) 
    { 
     StringBuilder sb = new StringBuilder(); 
     List<Type> genericParameters = null; 
     int arrayDimensions = 0; 
     bool ignore = false; 

     while (pos < name.Length) 
     { 
      char c = name[pos++]; 
      switch (c) 
      { 
       case ',': 
        { 
         if (arrayDimensions > 0) 
          arrayDimensions++; 
         else 
          ignore = true; 

         break; 
        } 
       case '[': 
        { 
         if (name[pos] == '[') 
         { 
          if (genericParameters == null) 
           genericParameters = new List<Type>(); 
          pos++; 
          genericParameters.Add(ParseInternal(name, ref pos)); 
         } 
         else if (genericParameters!=null) 
          genericParameters.Add(ParseInternal(name, ref pos)); 
         else 
          arrayDimensions++; 
         break; 
        } 
       case ']': 
        { 
         var currentName = sb.ToString(); 
         var type = AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes()).FirstOrDefault(x => x.FullName == currentName); 
         if (name.Length > pos && name[pos] == ']') 
         { 
          pos++; 
         } 
         if (genericParameters != null) 
         { 
          return type.MakeGenericType(genericParameters.ToArray()); 
         } 
         else if (arrayDimensions != 0) 
         { 
          return type.MakeArrayType(arrayDimensions); 
         } 
         return type; 
        } 
       default: 
        if (!ignore) 
         sb.Append(c); 
        continue; 
      } 
     } 
     { 
      var currentName = sb.ToString(); 
      var type = AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes()).FirstOrDefault(x => x.FullName == currentName); 
      if (genericParameters != null) 
      { 
       return type.MakeGenericType(genericParameters.ToArray()); 
      } 
      else if (arrayDimensions != 0) 
      { 
       return type.MakeArrayType(arrayDimensions); 
      } 
      return type; 
     } 
    } 
}