我做了一个迷你项目来反映我导入的dll的所有接口,这些接口继承自我的“IBase”界面
Type[] services = typeof(DataAccess.IXXX).Assembly.GetTypes();
foreach (Type SC in services)
{
if (SC.IsInterface)
{
if (SC.GetInterfaces().Contains(typeof(DataAccess.IBase)))
{
file.WriteLine(SC.Name);
}
}
}
问题是我的很多接口都包含泛型
public interface IExample<TKey, Tvalue, TCount> : IBase
但我的SC.Name就是这样写的
IExample'3
你能帮助我吗?
答案 0 :(得分:4)
IExample'3
是具有3个泛型类型参数的接口的内部名称(正如您可能已经猜到的那样)。要获取类或接口的泛型类型参数,请使用Type.GetGenericArguments
您可以使用类似的内容来打印正确的名称
var type = typeof(IExample<int, double>);
var arguments = Type.GetGenericArguments(type);
if(arguments.Any())
{
var name = argument.Name.Replace("'" + arguments.Length, "");
Console.Write(name + "<");
Console.Write(string.Join(", ", arguments.Select(x => x.Name));
Console.WriteLine(">")
}
else
{
Console.WriteLine(type.Name);
}
答案 1 :(得分:2)
我认为Type.GetGenericArguments Method是你需要的
答案 2 :(得分:1)
如您所见,.NET名称属性不会将通用参数类型显示为名称的一部分。您必须从GetGenericArguments获取参数类型。
这是一个方法,以C#样式返回泛型类型的名称。它是递归的,因此它可以处理具有泛型类型作为参数的泛型,即IEnumerable<IDictionary<string, int>>
using System.Collections.Generic;
using System.Linq;
static string FancyTypeName(Type type)
{
var typeName = type.Name.Split('`')[0];
if (type.IsGenericType)
{
typeName += string.Format("<{0}>", string.Join(",", type.GetGenericArguments().Select(v => FancyTypeName(v)).ToArray()));
}
return typeName;
}