繁体   English   中英

c# - 通用接口类型

[英]c# - Generic interfaces types

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

你能帮助我吗 ?

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

我认为Type.GetGenericArguments方法就是你所需要的

如您所见,.NET name属性不会将通用参数类型显示为名称的一部分。 您必须从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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM