获取字符串“System.Collections.ObjectModel.ObservableCollection

本文关键字:ObservableCollection Sy ObjectModel Collections 字符串 System 获取 | 更新日期: 2023-09-27 18:18:37

我正在解析一些dll,我必须生成一些将被编译的代码。目前,一切正常,但现在,我们必须处理Collections<>类型,这就是问题所在。对于ObservableCollection,我们得到FullName为:

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

并且考虑到我正在处理对象(我可以从DLL中读取任何内容),生成的代码应该是:

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

所以…有没有一种简单的方法可以从类型中做到这一点,或者我必须在字符串上做一些繁重的事情?(操纵propType。Name .Namespace和。getgenericarguments()…

获取字符串“System.Collections.ObjectModel.ObservableCollection<Sy

下面是最简单的方法:

//...
    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, '>');
}

也可以用代码进行实验。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));"
}