を(...)(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));"
}
うん/ –
@Guillaume Slashy:私の答えは私にとってそうではないので、私の答えは更新しました。) – DmitryG