• 解析类型层次结构的装配

  • 本文关于 c#,反射reflection,类型types,分层hierarchy
  • CodeGo.net > 解析类型层次结构的装配
  •  

    解析类型层次结构的装配



    c# 反射reflection 类型types 分层hierarchy
    考虑装配中的以下几种类型:BusinessPartnerList,业务伙伴,PrivateData,CompanyData,AddressList中,地址
    Type BusinessPartnerList 
    { 
     BusinessPartner[] 
    }
    Type BusinessPartner 
    {
     PrivateData
     CompanyData
     AddressList
    }
    Type PrivateData
    {
     System.String FirstName
     System.String SurName
    }
    Type PrivateData
    {
     System.String CompanName1
     System.String CompanName2
    }
    Type AddressList
    {
     Address[]
    }
    
    我想一般的解析式层次结构,并代表他们在一个树如简单的节点 BusinessPartnerList [] 业务合作伙伴 PrivateData CompanyData AddressList中[] 地址 什么是做到这一点的最好办法?
    本文地址 :CodeGo.net/1106159/
    -------------------------------------------------------------------------------------------------------------------------
    1.可惜你没'为您的样品数据正确C#语法。所以,我必须做出假设:Type实际上是class(或struct)。 该类型的内容(BusinessPartnerPrivateDataCompanyData等)代表的公共属性的类型。 解析类型层次结构你反思。找到一个给定类型的所有公共属性,并返回它们的类型。由于只想类型你HashSet这将只包含不同的类型:
    public static HashSet<Type> GetPropertyTypes(Type type)
    {
     return new HashSet<Type>(type.GetProperties(BindingFlags.Instance | BindingFlags.Public)
             .Select(prop => prop.PropertyType));
    }
    
    然而,似乎你不想要对数组,而是对数组的无二列出的类型。所以 CodeGo.net,如果一个类型IEnumerable<T>你要的类型T
    private static Type GetElementType(Type type)
    {
     Type enumerableType = type.GetInterfaces().FirstOrDefault(IsGenericEnumerable);
     if (enumerableType != null)
     {
      Type[] genericArguments = enumerableType.GetGenericArguments();
      return genericArguments[0];
     }
     // return 'object' for a non-generic IEnumerable
     return typeof(IEnumerable).IsAssignableFrom(type) ? typeof(object) : type;
    }
    private static bool IsGenericEnumerable(Type type)
    {
     return type.IsGenericType &&
       type.GetGenericTypeDefinition() == typeof(IEnumerable<>);
    }
    
    请注意,对于类型System.String这将返回charstringIEnumerable<char>(我稍后会地址)。 在。NET没有一个树形结构中,开箱即用。所以你需要自己动手:
    public class Node<T>
    {
     public Node(T value, IEnumerable<Node<T>> children)
     {
      Value = value;
      Children = children.ToList();
     }
     public T Value
     {
      get;
      private set;
     }
     public List<Node<T>> Children
     {
      get;
      private set;
     }
    }
    
    这是一个非常基本的只是用于演示目的。 而不是回国List<Type>GetPropertyTypes方法现在可以返回Node<Type>并且它应该是CreateTypeNode
    public static Node<Type> CreateTypeNode(Type type)
    {
     var children = type.GetProperties(BindingFlags.Instance | BindingFlags.Public)
          .Select(prop => GetElementType(prop.PropertyType))
          .Select(CreateTypeNode);
     return new Node<Type>(type, children);
    }
    
    使用递归来创建完整的树给定类型。 还有一个问题:如果什么类型的A引用类型B反之亦然?这将结束在一个无限递归循环。以及:如果一个类型已经被访问过,不需要那样做了。 我们需要的是对已被访问类型的缓存。如果类型是在从高速缓存高速缓存:
    private static readonly Dictionary<Type, Node<Type>> _visitedTypes = new Dictionary<Type, Node<Type>>();
    public static Node<Type> CreateTypeNode(Type type)
    {
     Node<Type> node;
     if (_visitedTypes.TryGetValue(type, out node))
     {
      return node;
     }
     // add the key to the cache to prevent infinite recursion; the value will be set later
     // if this type will be found again in a recursive call CreateTypeNode returns null
     // (null will be filtered out then)
     _visitedTypes.Add(type, null);
     var properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
     var types = new HashSet<Type>(properties.Select(prop => GetElementType(prop.PropertyType)));
     var children = types.Select(CreateTypeNode).Where(n => n != null);
     node = new Node<Type>(type, children);
     _visitedTypes[type] = node;
     return node;
    }
    
    我你不想要的string键入要报告为charstringIEnumerable<char>),你可以只添加一个节点string给你打电话之前缓存GetOrCreateTypeNode用于优先
    _visitedTypes.Add(typeof(string), new Node<Type>(typeof(string), new List<Node<Type>>()));
    
    然后检查缓存GetElementType方法:
    private static Type GetElementType(Type type)
    {
     if (_visitedTypes.ContainsKey(type))
     {
      return type;
     }
     ...
    }
    

    本文标题 :解析类型层次结构的装配
    本文地址 :CodeGo.net/1106159/
    1. C# 如何调用Win32 API?
    2. “FormatException是未处理”而程序没有计算结果
    3. c# 里怎么使用 CreateObject
    4. 错误的ObjectDataSource找不到一个非泛型方法
    5. 知道excel文件名,路径,sheet名,怎样用windows程序(c#)改变excel文件指定行的颜色?
    6. VB.net发送UDP消息两倍
    7. 如何update 整列!
    8. 如何从非托管内存中读取布尔值,使用Marshal类?
    9. 一个关于数据库插入
    10. 使用的EntityFramework客户端方的迁移

     
    

    Copyright © 2017 CodeGo.net
    http://codego.net/xinwen/ 足球比分网 足球比分 医药招商网 邵阳县新闻