获取与类型关联的所有名称空间?

蒂埃里

有没有一种方法可以使用Reflection获取与类/类型关联的所有名称空间?

例如,假设我的变量是:

var list = List<MyClass> 

我的课被定义为

public class MyClass
{
   property int32 MyNumber {get; set;}
}

我希望能够返回以下名称空间:

  • MyCompany.MyClass(正在使用我的MyClass)
  • System.Collections.Generic(如List所使用)
  • 系统为int32(因为MyNumber正在使用它)

谢谢。

奥利维尔·罗吉尔(Olivier Rogier)

您可以使用反射来解析类型。

由于框架设计,您将获得比预期更多的结果。

我希望我没有犯太多错误。

考试

namespace ConsoleApp
{
  public class Program
  {
    static public void Main(string[] args)
    {
      var list = new List<MyClass>();
      var typeSearched = list.GetType();
      Console.WriteLine($"{typeSearched.Name} needs these namespaces:");
      foreach ( var item in typeSearched.GetUsingNamespaces().OrderBy(kvp => kvp.Key) )
      {
        string names = string.Join(Environment.NewLine + "    ",
                                   item.Value.Select(t => t.Name)
                                             .OrderBy(n => n));
        Console.WriteLine($"# {item.Key} for type(s):" + Environment.NewLine +
                          $"    {names}");
        Console.WriteLine();
    }
  }
  public class MyClass
  {
    public Int32 MyNumber {get; set;}
  }
}

反射助手类

using System;
using System.Linq;
using System.Collections.Generic;
using System.Reflection;

namespace ConsoleApp
{
  static public class ReflexionHelper
  {
    // See below
  }
}

工具方法

static public void AddNoDuplicates<T>(this IList<T> list, T value)
{
  if ( !list.Contains(value) ) list.Add(value);
}

static public void AddNoDuplicates<TKey, TValue>(this IDictionary<TKey, List<TValue>> list,
                                                 TKey key, TValue value)
{
  if ( key == null ) return;
  if ( !list.ContainsKey(key) )
    list.Add(key, new List<TValue>() { value });
  else
  if ( !list[key].Contains(value) )
    list[key].Add(value);
}

static public void AddRangeNoDuplicates<T>(this IList<T> list, IEnumerable<T> collection)
{
  foreach ( T value in collection )
    if ( !list.Contains(value) )
      list.Add(value);
}

解析类型的方法

static public Dictionary<string, List<Type>> GetUsingNamespaces(this Type typeSearched)
{
  var result = new Dictionary<string, List<Type>>();
  result.AddNoDuplicates(typeSearched.Namespace, typeSearched);
  foreach ( Type type in typeSearched.GetMembersTypes() )
  {
    result.AddNoDuplicates(type.Namespace, type);
    foreach ( var implement in type.GetInterfaces() )
      result.AddNoDuplicates(implement.Namespace, implement);
    foreach ( var argument in type.GetGenericArguments() )
      result.AddNoDuplicates(argument.Namespace, argument);
  }
  return result;
}

获取类型的所有成员的方法

static public List<Type> GetMembersTypes(this Type type)
{
  var flags = BindingFlags.Static
            | BindingFlags.Instance
            | BindingFlags.Public
            | BindingFlags.NonPublic;
  var result = new List<Type>();
  foreach ( var field in type.GetFields(flags) )
    result.AddNoDuplicates(field.FieldType);
  foreach ( var property in type.GetProperties(flags) )
    result.AddNoDuplicates(property.PropertyType);
  foreach ( var ev in type.GetEvents(flags) )
    result.AddNoDuplicates(ev.EventHandlerType);
  foreach ( var method in type.GetMethods(flags) )
  {
    result.AddNoDuplicates(method.ReturnType);
    foreach ( var a in method.GetParameters() )
      result.AddNoDuplicates(a.ParameterType);
  }
  foreach ( var constructor in type.GetConstructors() )
    foreach ( var param in constructor.GetParameters() )
      result.AddNoDuplicates(param.ParameterType);
  foreach ( var nested in type.GetNestedTypes(flags) )
    result.AddRangeNoDuplicates(GetMembersTypes(nested));
  return result;
}

未来的改进

分析属性和其他遗忘的东西。

测试输出短路

ConsoleApp
System
System.Collections
System.Collections.Generic
System.Collections.ObjectModel
System.Reflection
System.Runtime.InteropServices
System.Runtime.Serialization

测试输出已满

# ConsoleApp for type(s):
    MyClass
    MyClass[]

# System for type(s):
    Action`1
    Array
    Boolean
    Comparison`1
    Converter`2
    ICloneable
    IComparable
    IComparable`1
    IComparable`1
    IComparable`1
    IConvertible
    IDisposable
    IEquatable`1
    IEquatable`1
    IEquatable`1
    IFormattable
    Int32
    Object
    Predicate`1
    String
    Type
    Void

# System.Collections for type(s):
    ICollection
    IEnumerable
    IEnumerator
    IList
    IStructuralComparable
    IStructuralEquatable

# System.Collections.Generic for type(s):
    Enumerator
    ICollection`1
    ICollection`1
    ICollection`1
    ICollection`1
    IComparer`1
    IEnumerable`1
    IEnumerable`1
    IEnumerable`1
    IEnumerable`1
    IEnumerable`1
    IEnumerator`1
    IEnumerator`1
    IList`1
    IList`1
    IList`1
    IList`1
    IReadOnlyCollection`1
    IReadOnlyCollection`1
    IReadOnlyCollection`1
    IReadOnlyCollection`1
    IReadOnlyList`1
    IReadOnlyList`1
    IReadOnlyList`1
    IReadOnlyList`1
    List`1
    List`1
    List`1
    List`1
    T
    T
    T[]
    TOutput

# System.Collections.ObjectModel for type(s):
    ReadOnlyCollection`1

# System.Reflection for type(s):
    ICustomAttributeProvider
    IReflect

# System.Runtime.InteropServices for type(s):
    _MemberInfo
    _Type

# System.Runtime.Serialization for type(s):
    ISerializable

某些类型名称重复,但Type实例不同...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

获取系统名称空间中的所有.net可用类型

来自分类Dev

如何通过程序集获取项目中的所有名称空间?

来自分类Dev

如何从dom文档中删除所有名称空间

来自分类Dev

BeaitifulSoup无法读取所有名称空间

来自分类Dev

通过XPathSelectElements获取带有名称空间的XElement

来自分类Dev

在Java中获取具有名称空间的XML节点

来自分类Dev

从具有名称空间的XBRL获取属性值

来自分类Dev

如何从名称空间获取所有密钥?

来自分类Dev

从名称空间获取所有配置

来自分类Dev

取消绑定除特定名称空间之外的所有名称空间的事件

来自分类Dev

取消绑定除特定名称空间之外的所有名称空间的事件

来自分类Dev

从xml-conduit获取所有名称

来自分类Dev

从对象及其子对象获取所有名称

来自分类Dev

使用-声明现有名称空间类型与创建类型别名

来自分类Dev

Nokogiri:如何获取带有名称空间前缀的节点名称

来自分类Dev

如何在Laravel中通过路由名称获取带有名称空间的路由?

来自分类Dev

是否有名称空间所有保留关键字的列表?

来自分类Dev

是否有可能使kubernetes入口treafik适用于所有名称空间

来自分类Dev

具有名称空间的路径定义

来自分类Dev

带有名称空间包的pyinstaller

来自分类Dev

具有名称空间的openxml

来自分类Dev

具有名称空间的PostgresSQL xpath

来自分类Dev

有名称空间时的UPDATEXML

来自分类Dev

如何强制将所有名称空间声明附加到根元素?

来自分类Dev

名称空间“ std”中没有名为“ nullptr_t”的类型

来自分类Dev

Android NDK-名称空间“ std”中没有名为“ function”的类型

来自分类Dev

类型转换为具有名称空间的另一个类?

来自分类Dev

错误:名称空间“ std”中没有名为“ vector”的类型

来自分类Dev

Android NDK-名称空间“ std”中没有名为“ function”的类型

Related 相关文章

  1. 1

    获取系统名称空间中的所有.net可用类型

  2. 2

    如何通过程序集获取项目中的所有名称空间?

  3. 3

    如何从dom文档中删除所有名称空间

  4. 4

    BeaitifulSoup无法读取所有名称空间

  5. 5

    通过XPathSelectElements获取带有名称空间的XElement

  6. 6

    在Java中获取具有名称空间的XML节点

  7. 7

    从具有名称空间的XBRL获取属性值

  8. 8

    如何从名称空间获取所有密钥?

  9. 9

    从名称空间获取所有配置

  10. 10

    取消绑定除特定名称空间之外的所有名称空间的事件

  11. 11

    取消绑定除特定名称空间之外的所有名称空间的事件

  12. 12

    从xml-conduit获取所有名称

  13. 13

    从对象及其子对象获取所有名称

  14. 14

    使用-声明现有名称空间类型与创建类型别名

  15. 15

    Nokogiri:如何获取带有名称空间前缀的节点名称

  16. 16

    如何在Laravel中通过路由名称获取带有名称空间的路由?

  17. 17

    是否有名称空间所有保留关键字的列表?

  18. 18

    是否有可能使kubernetes入口treafik适用于所有名称空间

  19. 19

    具有名称空间的路径定义

  20. 20

    带有名称空间包的pyinstaller

  21. 21

    具有名称空间的openxml

  22. 22

    具有名称空间的PostgresSQL xpath

  23. 23

    有名称空间时的UPDATEXML

  24. 24

    如何强制将所有名称空间声明附加到根元素?

  25. 25

    名称空间“ std”中没有名为“ nullptr_t”的类型

  26. 26

    Android NDK-名称空间“ std”中没有名为“ function”的类型

  27. 27

    类型转换为具有名称空间的另一个类?

  28. 28

    错误:名称空间“ std”中没有名为“ vector”的类型

  29. 29

    Android NDK-名称空间“ std”中没有名为“ function”的类型

热门标签

归档