2011-12-23 84 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

相關問題