【问题标题】:How to find namespace of class by its name using reflection in .net core?如何使用.net核心中的反射通过名称查找类的命名空间?
【发布时间】:2016-11-13 12:07:24
【问题描述】:

我有一个只有类名的字符串列表。我需要使用 Activator 创建它们的实例,但它们都可以位于不同的命名空间中。将来类可以移动到另一个命名空间,所以我不能硬编码它。

【问题讨论】:

  • 您是锁定在拥有string 的列表,还是可以拥有Type 的列表?如果你只有strings,你想如何处理有多个同名类型(在不同的命名空间中)的情况?
  • 不幸的是我被锁定了。类列表来自文本文件,我需要创建适当的对象。
  • 请务必查看此线程:How to get all classes within namespace?

标签: c# reflection asp.net-core


【解决方案1】:

如果您知道永远不会有多个同名的类型驻留在不同的命名空间中,您可以遍历程序集中的所有类型并过滤类型名称。例如,这有效:

var typenames = new[] { "String", "Object", "Int32" };

var types =  typeof(object).GetTypeInfo().Assembly
    .GetTypes()
    .Where(type => typenames.Contains(type.Name))
    .ToArray(); // A Type[] containing System.String, System.Object and System.Int32

如果您有多个具有相同名称的类型,这不一定会中断,但您会在列表中获得所有类型。

【讨论】:

  • 它不适用于 .Net Core。 Assembly does not have definition of GetAssembly.
  • 它可以工作,但您可能需要在 project.json 中添加一个框架程序集依赖项。给我几分钟,我看看能不能弄明白是哪一个。
  • @MKasprzyk with net core 你可以使用typeof(object).GetTypeInfo().Assembly 来获取汇编。
【解决方案2】:

您可以获取程序集的所有类型并找到具有相关名称的程序集。

var type = assembly.GetTypes().FirstOrDefault(x => x.Name == name);

注意:名称可能不是唯一的。在这种情况下,您没有机会找到正确的类型,除非您可以对命名空间 8e.g. 有一些猜测。可能的命名空间列表、命名空间的“黑名单”等)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 2014-12-03
    相关资源
    最近更新 更多