如何知道一个类型是直接实现一个接口?

时间:2018-11-16 02:45:48

标签: reflection

我有三个界面:

interface ILocalData
{
    int Pkey { get; set; }
}

interface IRegionData : ILocalData
{
    int RegionServerPkey { get; set; }
}

interface IMainData : IRegionData
{
    int MainServerPkey { get; set; }
}

以及从它们继承的一些类型:

//data in local database only
class Type1 : ILocalData
{
    public int Pkey { get; set; }

    public string Data1 { get; set; }
}

//data in local database and region server database
class Type2 : IRegionData
{
    public int Pkey { get; set; }
    public int RegionServerPkey { get; set; }

    public int Data2 { get; set; }
}

//data in local, region server and main server database
class Type3 : IMainData
{
    public int Pkey { get; set; }
    public int RegionServerPkey { get; set; }
    public int MainServerPkey { get; set; }

    public DateTime Data3 { get; set; }
}

这些类彼此不继承的原因是,它们是数据库从EF生成的类,并且每个类包含不同的字段。

现在,我想知道某个类型是否直接从接口实现,例如Type1是直接实现ILocalData,而Type2Type3不是。

interfaceType。 IsAssignableFrom (classType)不起作用,因为它将检查该类的更高接口。

classType.GetInterfaces().Except(classType.BaseType.GetInterfaces()).Contains(interfaceType)来自另一个question的原因是,它们不是彼此继承的。

这可能吗?

-------------------------更新--------------------- --------

硬编码有效:

var types = new Type[] { typeof(Type1), typeof(Type2), typeof(Type3), typeof(string), typeof(int) };
foreach (var group in types
    .Where(item => typeof(ILocalData).IsAssignableFrom(item))
    .GroupBy(item => item.GetInterfaces(), item => item, new TypesComparer()))
{
    if (group.Key.Contains(typeof(IMainData)))
    {
        Console.WriteLine($"{group.First().Name} - IMainData");
    }
    else if (group.Key.Contains(typeof(IRegionData)))
    {
        Console.WriteLine($"{group.First().Name} - IRegionData");
    }
    else if (group.Key.Contains(typeof(ILocalData)))
    {
        Console.WriteLine($"{group.First().Name} - ILocalData");
    }
}

sealed class TypesComparer : IEqualityComparer<Type[]>
{
    public bool Equals(Type[] x, Type[] y)
    {
        if (x == null || x.Length == 0)
            return y != null && y.Length > 0;
        else if (y == null || y.Length == 0)
            return false;
        return !x.Except(y).Concat(y.Except(x)).Any();
    }

    public int GetHashCode(Type[] obj)
    {
        if (obj == null)
            return -1;
        return obj.Length;
    }
}

哪个输出:

Type1 - ILocalData Type2 - IRegionData Type3 - IMainData

0 个答案:

没有答案