【问题标题】:C# Function which accepts Base Class Name/Type as parameter and returns name of all its children接受基类名称/类型作为参数并返回其所有子类名称的 C# 函数
【发布时间】: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


【解决方案1】:

这是基于我的问题中添加的 cmets 的解决方案:

private object GetKidsOfBaseClass(Type baseType)
{
    var blahKids = 
    AppDomain.CurrentDomain.GetAssemblies().SelectMany(ass => ass.GetTypes())
        .Where(p => p.IsSubclassOf(baseType)).ToList();

    return blahKids;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    相关资源
    最近更新 更多