c# - 通用接口类型

时间:2015-10-20 07:39:29

标签: c# generics

我做了一个迷你项目来反映我导入的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

你能帮助我吗?

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;
}