【发布时间】:2020-04-24 10:32:38
【问题描述】:
我需要编写一个函数,它接受一个基类名称并在 C# 中返回其所有子类的名称。 众所周知,在命名空间中,我们有几个基类,每个基类都有自己的子类。上述函数(将位于工具中)的目的是从用户获取基类名称,然后返回其所有子类的名称。 (我们可以在创建批处理文件时使用结果) 我假设我需要使用反射和泛型,但不确定如何。你能帮我解决一下吗?
如果我将基类的名称作为字符串传递,函数会是什么样子? 如果我将基类名称作为泛型类型传递应该如何?
cmets 后提问的版本:
根据答案中建议的页面,我尝试了以下函数,但它为孩子和 blahKids 返回 null
private object GetKidsOfBaseClass(string baseClass)
{
Type baseType = Type.GetType($"{baseClass}");
var blahKids = AppDomain.CurrentDomain.GetAssemblies().SelectMany(ass => ass.GetTypes())
.Where(p => p.IsSubclassOf(baseType));
var kids = Assembly.GetAssembly(baseType).GetTypes().Where(t => t.IsSubclassOf(baseType));
return kids;
}
@madreflection 建议后的第二版: 以下代码对我有用:
private object GetKidsOfBaseClass(Type baseType)
{
var blahKids =
AppDomain.CurrentDomain.GetAssemblies().SelectMany(ass => ass.GetTypes())
.Where(p => p.IsSubclassOf(baseType)).ToList();
return blahKids;
}
【问题讨论】:
-
你试过什么?听起来你知道它需要什么参数以及你期望它返回什么。你肯定有一些东西可以展示你到目前为止所做的努力。
-
@madreflection 我在第二条评论中添加了一个代码,请您查看一下并告诉我您的建议,谢谢!
-
@madreflection 刚刚编辑了问题!
-
baseClass传递什么?我强烈建议接受Type实例而不是名称,并将其留给调用者以获取Type实例。Type.GetType并不总是可靠的。良好的图书馆设计不会将消费者锁定在与图书馆目的无关的事物中。 -
@madreflection 成功了!谢谢!
标签: c# generics reflection base-class