Получение строки "System.Collections.ObjectModel.ObservableCollection"из типа, который является ObservableCollection <string>? - PullRequest
0 голосов
/ 23 декабря 2011

Я анализирую некоторые библиотеки DLL, и мне нужно сгенерировать код, который будет скомпилирован.На данный момент все работает, но теперь мы должны обрабатывать типы Collections <>, и здесь есть проблема.В случае ObservableCollection мы получили тип, FullName которого:

"System.Collections.ObjectModel.ObservableCollection`1[System.String]"

и, учитывая, что я имею дело с объектами (я могу читать все из DLL), сгенерированный код должен быть:1004 *

var obj7 = (System.Collections.ObjectModel.ObservableCollection<System.String>) myParsedProperty; //This code will, then, be compiled + executed

Итак ... есть ли простой способ сделать это с помощью Type или мне нужно сделать что-то тяжелое в Strings?(манипулирование propType.Name .Namespace и .GetGenericArguments () ...)

1 Ответ

1 голос
/ 23 декабря 2011

Вот самый простой подход:

//...
    Type type = typeof(IList<string>);
    string definition = GetGenericTypeDefinitionString(type);
    //definition is "System.Collections.Generic.IList<System.String>"
}

static string GetGenericTypeDefinitionString(Type genericType) {
    string genericTypeDefName = genericType.GetGenericTypeDefinition().FullName;
    string typePart = genericTypeDefName.Substring(0, genericTypeDefName.IndexOf('`'));
    string argumentsPart = string.Join(",",
        Array.ConvertAll(genericType.GetGenericArguments(), (t) => t.FullName));
    return string.Concat(typePart, '<', argumentsPart, '>');
}

Также вы можете поэкспериментировать с Code.Dom:

using System.CodeDom;
using Microsoft.CSharp;
//...
Type targetType = typeof(IList<string>);
//...
CSharpCodeProvider provider = new CSharpCodeProvider();
CodeExpression cast = new CodeCastExpression(targetType, new CodeVariableReferenceExpression("genericCollection"));
CodeStatement statement = new CodeVariableDeclarationStatement(new CodeTypeReference(targetType), "list", cast);
using(StringWriter writer = new StringWriter()) {
    provider.GenerateCodeFromStatement(statement, writer, null);
    string expression = writer.ToString();
   // expression is "System.Collections.Generic.IList<string> list = ((System.Collections.Generic.IList<string>)(genericCollection));"
}
...