С CompactFramework
, я получил TypeString
, который может быть типа комплекс, то есть он может использовать дженерики, массивы и т.д. Это означает, что она может выглядеть Sytem.Tuple’1[[Sytem.String, mscorlib]]
. Проблема в том, что я не могу использовать Type.GetType
, потому что assemblys
в Typestring
может быть неправильным или нет. Есть ли библиотека lib, которая анализирует строку и возвращает тип путем поиска всех типов в appdomain
для правильного?Разбираем сложную TypeName из строки в C#
-1
A
ответ
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;
}
}
}
Смежные вопросы
- 1. Разбираем Сложную структуру XML
- 2. Разбираем сложную дату с SimpleDateFormat
- 3. Разбираем сложную строку с одним регулярным выражением
- 4. Разбираем дату из строки
- 5. Слово «typename» в C++
- 6. Разбираем общие строки XML с помощью C#
- 7. C++ typename в определении функции
- 8. Objective C - Разбираем NSData
- 9. typename в шаблонах в C++
- 10. Разделить сложную строку в C
- 11. C++ typename как переменная
- 12. C++ typename переменной-члена
- 13. Какова цель "TypeName" в C++
- 14. Как использовать typename в C++?
- 15. Как я могу Разбираем CSV в C#
- 16. find typename typename в параметре шаблона
- 17. Objective C - Разбираем JSon массив
- 18. C macro добавление к typename
- 19. C++ typename и внутренние классы
- 20. typename в абстрактном классе шаблона в C++
- 21. C# Разбираем список значений в двух полях
- 22. десериализации Json строки в сложную Java Object
- 23. Разбираем уникальную строку из сложной последовательной передачи данных C#
- 24. Разбираем некоторые элементы из XML
- 25. Разбираем выход subprocess.call() из Python
- 26. Dynamic typename в vb.net
- 27. Разбираем дату в рельсах
- 28. Как правильно определить тип типа typename typename ...?
- 29. Разбираем текстовый файл и сохранить в CSV-
- 30. Разбираем эти данные из JSON в NSDictionary
Это не будет работать. Сборочные имена могут быть неправильными –
, если вы посмотрите точно, Type.parse находится в javascript –