這是最簡單的方法:
//...
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));"
}
沒錯,這是我有的代碼類型,但對我來說它有點兒不舒服:/ – 2011-12-23 13:35:01
@Guillaume Slashy:我已經更新了我的回答,但不是那麼「吸」我)回答) – DmitryG 2011-12-23 15:25:39