c# – 如何以编程方式从一堆子类中找到最深入的公共基类型?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何以编程方式从一堆子类中找到最深入的公共基类型?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2409字,纯文字阅读大概需要4分钟。
内容图文
![c# – 如何以编程方式从一堆子类中找到最深入的公共基类型?](/upload/InfoBanner/zyjiaocheng/824/fb07597bd95748f798ffc4ece6e6d659.jpg)
给定一组不同的对象,是否有可能找到他们共享的最具体的基类?
例如,给定具有这些类层次结构的对象……
object -> Vehicle -> WheeledVehicle -> Car -> SportsCar
object -> Vehicle -> WheeledVehicle -> Bus
object -> Vehicle -> WheeledVehicle -> MotorCycle
object -> Vehicle -> WheeledVehicle -> Tricycle -> BigWheel
object -> Vehicle -> WheeledVehicle -> Tricycle -> Green Machine
(为了娱乐…
http://www.wired.com/autopia/2011/03/green-machine-bike-is-a-big-wheel-for-grownups)
是否可以使用此签名编写函数…
public Type GetCommonBaseType(List<object> objects)
{
...
};
…让它返回’WheeledVehicle’?
我的想法是以某种方式为每个对象构建继承链列表,反转它们以便它们都以“对象”开头,然后向下走,检查所有列表中的匹配.如果任何项目不匹配,那么前面的步骤是您最深的匹配基类型.
但是,由于“基地”是内部成员,我不确定如何建立链条.这是你可以使用Reflection确定的东西吗?
解决方法:
您可以使用反射来执行此操作.假设我们从Type实例而不是对象开始 – 这是更通用的,您可以简单地将对象列表转换为其运行时类型列表,以涵盖您提到的用例.
我们的想法是遍历每个输入类型的所有基类,并为每个输入类型增加一个“类型实例计数器”.执行此操作后,输入类型的所有公共基础必须使其计数器等于输入类型的数量.哪一个是派生最多的?轻松,选择任何输入类型并开始遍历其类型层次结构,直到找到一个共同的基础;该类型是派生最多的共同基础.
代码
我将使用此扩展方法:
public static IEnumerable<Type> TypeHierarchy(this Type type)
{
do
{
yield return type;
type = type.BaseType;
} while (type != null);
}
然后允许这个实现 – 感谢LINQ,它读起来几乎像英语:
public Type MostDerivedCommonBase(IEnumerable<Type> types)
{
if (!types.Any()) return null;
var counts = new Dictionary<Type, int>();
var total = types.Count();
foreach(var type in types.SelectMany(t => t.TypeHierarchy()))
{
if (!counts.ContainsKey(type))
{
counts[type] = 1;
}
else
{
counts[type]++;
}
}
return types.First().TypeHierarchy().First(t => counts[t] == total);
}
您可以使用例如
var types = new[] { typeof(MemoryStream), typeof(FileStream) };
Console.WriteLine(MostDerivedCommonBase(types)); // System.IO.Stream
更新
事后看来,很明显,构建类型字典也可以完全使用LINQ来完成.因此,如果紧凑是你的一杯茶,代码可以简化为:
public Type MostDerivedCommonBase(IEnumerable<Type> types)
{
if (!types.Any()) return null;
var counts = types.SelectMany(t => t.TypeHierarchy())
.GroupBy(t => t)
.ToDictionary(g => g.Key, g => g.Count());
var total = counts[typeof(object)]; // optimization instead of types.Count()
return types.First().TypeHierarchy().First(t => counts[t] == total);
}
内容总结
以上是互联网集市为您收集整理的c# – 如何以编程方式从一堆子类中找到最深入的公共基类型?全部内容,希望文章能够帮你解决c# – 如何以编程方式从一堆子类中找到最深入的公共基类型?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。