热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LINQtoReflection(翻译)

[索引页]今天有空就研究一下LINQ和泛型,Reflection的应用,看见一篇很好的文章就翻译过拉!LINQtoReflection地址LINQ是很好的东西,允许我们查任何实现I
[索引页]



今天有空就研究一下LINQ和泛型,Reflection的应用,看见一篇很好的文章就翻译过拉!


LINQ to Reflection
地址



LINQ是很好的东西,允许我们查任何实现IEnumerable对象.其中包括List,Collection,和其他更多的.很多查询操作符号都是拉反射返回数组,接下来我使用的这些LINQ 操作符就是.


Loading up assemblies for searching




首先,我想加载一些assemblies去搜索,这很容易的就发现使用System.Reflection.Assembly.LoadWithPartialName,可是这个方法是.NET推荐使用的方法.但这个方法将满足简单达到搜索要求.我不想使用写代码的方式.

首先带来的就是一个要搜索的assembly名的清单并把他们放入的数组.

string[] assemblyNames = "System"
                 
"mscorlib"
                 
"System.AddIn",
                 
"System.Configuration"
                 
"System.Core"
                 
"System.Data",
                 
"System.Data.Entity",
                 
"System.Data.Entity.Design",
                 
"System.Data.Linq",
                 
"System.Deployment",
                 
"System.Design",
                 
"System.DirectoryServices",
                 
"System.DirectoryServices.Protocols",
                 
"System.Drawing",
                 
"System.Drawing.Design",
                 
"System.EnterpriseServices",
                 
"System.IdentityModel",
                 
"System.IdentityModel.Selectors",
                 
"System.Management",
                 
"System.Management.Instrumentation",
                 
"System.Messaging",
                 
"System.Printing",
                 
"System.Runtime.Remoting",
                 
"System.Runtime.Serialization",
                 
"System.Security",
                 
"System.ServiceModel",
                 
"System.ServiceProcess",
                 
"System.Transactions",
                 
"System.Web"
                 
"System.Web.Services"
                 
"System.Windows.Forms"
                 
"System.Workflow.Activities"
                 
"System.Workflow.ComponentModel"
                 
"System.Workflow.Runtime"
                 
"System.WorkflowServices"
                 
"System.Xml"
                 
"System.Xml.Linq"
             }
;

都是非长漂亮的.NET Framework 3.5 assemblies,下一步,我要创建一个LINQ 查询去查询加载上的的assemblies,所以我能执行搜索这些assemblies.这是使用扩展方法:

var assemblies = assemblyNames.Select(name => Assembly.LoadWithPartialName(name));


下面是查询语法方式:

var assemblies = from name in assemblyNames
            select Assembly.LoadWithPartialName(name);


assemblies是变量,我们能在被加载assemblies中的执行查询.


Finding generic delegates




我已经体验一个API,并且如果我要知道现在有的.NET中的generic delegate.我们使用LINQ 表达方式很轻易的从已经加载的assemblies中得到.但首先,我需要知道怎样查找.我只能加载generic delegate到已经知道Type object中.

Type actionDelegate &#61; typeof(Action<>);


当我加载一个generic delegate 进入一个Type对象中时,我注意一些关键属性,如"IsGenericType" and "IsPublic"这两个属性能决定它是否是generic,但不能决定是delegate,不幸运的是没有"IsDelegate",但我们可以转而使用IsSubclassOf(typeof(Delegate))返回"true".综合上面三个条件就能判定,我已经有一个predicate在我的搜索assemblies中使用.

var types &#61; from name in assemblyNames
            select Assembly.LoadWithPartialName(name) into a
            from c 
in a.GetTypes()
            
where c.IsGenericType && c.IsPublic && c.IsSubclassOf(typeof(Delegate))
            select c;

foreach (Type t in types)
{
    Debug.WriteLine(t);
}


这里是LINQ同过一个附加部分("into a")结合在一起.这里首先查询枚举assembly名查询加载到assemblies.第二个查询在每一个assembly中调用"GetType"去查询加载的assembly类型,并且使用"where" clause在里面填充predicate就能很容易的筛选generic delegates.下面片段就结果.

System.EventHandler&#96;1[TEventArgs]
System.Action&#96;
1[T]
System.Comparison&#96;
1[T]
System.Converter&#96;
2[TInput,TOutput]
System.Predicate&#96;
1[T]
System.Linq.Func&#96;
1[TResult]
System.Linq.Func&#96;
2[TArg0,TResult]
System.Linq.Func&#96;
3[TArg0,TArg1,TResult]
System.Linq.Func&#96;
4[TArg0,TArg1,TArg2,TResult]
System.Linq.Func&#96;
5[TArg0,TArg1,TArg2,TArg3,TResult]


但并不是全部,但已经有的已经在这里拉.特别的是,我已经发现重载Action,如同如果像Func有多个委托声明时候样,可是这里没有,但你可以到计划重载Action匹配func.


Context 和 IDisposable




(I had a discussion with a team member that centered around types with names postfixed with "Context".)
已经讨论以命名后缀"Context&#39;为中心的类型一组成员.我说明命名"Context"的类型隐含实现拉IDisposable,它被用来创建一个scope.
我只有通过得到一些真实的数据并找到在.NET Framework中被命名为"Context"还实现IDisposabble的来说明推测.下面是LINQ query

var types &#61; from name in assemblyNames
            select Assembly.LoadWithPartialName(name) into a
            from c 
in a.GetTypes()
            
where (c.IsClass || c.IsInterface) && c.FullName.EndsWith("Context")
            group c.FullName by c.GetInterfaces().Contains(
typeof(IDisposable)) into g
            select 
new { IsIDisposable &#61; g.Key, Types &#61; g };


在查询中,我要查找所有以"Context"结尾的类型,并且按照是否实现IDisposable返回二进制的方式分组.并且我还取两个数据组合,并且anonymous types持有数据.下面可以输出结果.


foreach (var g in types)
{
    Debug.WriteLine(
string.Format("{0} types where IsIDisposable is {1}", g.Types.Count(), g.IsIDisposable));
    
if (g.IsIDisposable)
    
{
        
foreach (string t in g.Types)
        
{
            Debug.WriteLine(t);
        }

    }

}

并且最被找到说明我的论点不被支持.下面是输出结果.

144 types where IsIDisposable is False
50 types where IsIDisposable is True


我的左侧输出打印出所有的Context IDisposable类型,清单相当的长.我决定没有过滤non-public 类型,如MS 趋向产生有很多"internal"类型.所以它输出只有25%的以"Context"类型结尾的类型实现IDisposable,所以我的推断是错误的.


Other applications




LINQ provides a clean syntax to search assemblies using reflection.  I&#39;ve also used it to argue against read-write properties for array types (they account for only 0.6% of all collection-type properties).  The continuations and joining lower the barrier for searching for specific types, properties, etc.  Since the LINQ methods are extension methods for any IEnumerable type, you&#39;ll be pleasantly surprised when IntelliSense kicks in at the options available for querying and manipulating collections and arrays.



works guo 翻译



推荐阅读
  • Ajax智能匹配检索(含图含完整代码)
    使用谷歌搜索引擎的用户都知道,只要在文本框中输入部分关键字,就能显示相关搜索提示信息列表。如图:   本技术的核心是通过ASP.NETAjaxControlToolkit中的Aut ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Win10下游戏不能全屏的解决方法及兼容游戏列表
    本文介绍了Win10下游戏不能全屏的解决方法,包括修改注册表默认值和查看兼容游戏列表。同时提供了部分已经支持Win10的热门游戏列表,帮助玩家解决游戏不能全屏的问题。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 伟大的职位,总是不经意之间就出来了,要找好多人呀~~~~~WirelessLightRadioApplicationSoftwareEngineerLocat ... [详细]
author-avatar
楠楠2502858265
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有