2017-02-23 72 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; 
     } 
    } 
}