2011-12-23 18 views
0

私はいくつかのDLLを解析しているので、コンパイルするいくつかのコードを生成する必要があります。 現時点ではすべて動作しますが、今はCollections <>型を処理する必要があります。ここで問題があります。ObservableCollectionの型から文字列 "System.Collections.ObjectModel.ObservableCollection <System.String>"を取得する<string>?

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

と私は(私はDLLから何かを読み取ることができます)オブジェクトを扱ってることを考えるとは、生成されたコードは次のようになります:

のObservableCollectionの場合 、我々は、そのフルネームであるタイプです
var obj7 = (System.Collections.ObjectModel.ObservableCollection<System.String>) myParsedProperty; //This code will, then, be compiled + executed 

だから、タイプからそれを行う簡単な方法がありますか、またはストリングで重いものをいくつかする必要がありますか?ここで

答えて

1

を(...)(propType.Name .Namespaceと.GetGenericArgumentsを操作することは)最も簡単な方法です:

//... 
    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

うん/ –

+0

@Guillaume Slashy:私の答えは私にとってそうではないので、私の答えは更新しました。) – DmitryG

関連する問題