2011-12-23 88 views
0

我正在解析一些DLL,我必须生成一些将被编译的代码。 目前,一切正常,但现在,我们必须处理集合<>类型,这里是问题所在。 在一个ObservableCollection的情况下,我们得到了它的全名是类型:从ObservableCollection类型获取字符串“System.Collections.ObjectModel.ObservableCollection <System.String>”<string>?

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

,并考虑到我负责的对象(我可以阅读从DLL的任何东西),生成的代码应该是:

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

那么......有没有一种简单的方法可以从Type中做到这一点,还是我必须在字符串上做一些沉重的事情? (操作propType.Name .Namespace和.GetGenericArguments()...)

回答

1

这是最简单的方法:

//... 
    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));" 
} 
+0

没错,这是我有的代码类型,但对我来说它有点儿不舒服:/ – 2011-12-23 13:35:01

+0

@Guillaume Slashy:我已经更新了我的回答,但不是那么“吸”我)回答) – DmitryG 2011-12-23 15:25:39

相关问题