我有三个界面:
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
,而Type2
和Type3
不是。
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