随笔分类 - Emit
动态生成类型/方法
踩到一个Emit的坑,留个纪念
摘要:重现代码:var dmFoo = new DynamicMethod("Foo", typeof(void), Type.EmptyTypes);var ilFoo = dmFoo.GetILGenerator();//...var label = ilFoo.DefineLabel();//...var dmBar = new DynamicMethod("Bar", typeof(void), Type.EmptyTypes);var ilBar = dmBar.GetILGenerator();//...ilBar.MarkLabel(label)
阅读全文
Sliverlight调用Rest服务的一点思考和实践
摘要:最近在写一个SL的小工具,用于图形化编辑一些东西。刚好调用的服务是WCF的Rest方式,于是就碰到了在SL里面直接调用Rest服务的问题,本来Rest服务就是只要有url和内容就可以直接调用的,事实上如果搜索该主题,也可以得到漫山遍野的WebClient方案。不过看看Framework下的WebChannelFactory<TChannel>这个类(这个类型在SL下面不支持...),又感觉用WebClient方式太寒酸了点。。。 这里讨论的前提是: 已经有Rest服务的契约 不想自己去拼请求 期望的结果应该是类似与调用WebService的方式。 然后,就慢慢开始达成我们的目标吧。
阅读全文
快速类型判定
摘要: 最近在写一段代码的时候,为了兼容各种未知的类型,以及完成一个根据类型自动分派的任务到对应的处理器时,使用了这样的一个契约: 用一个object数组来转递值,每个处理器则声明一个可以处理的类型组合。 然后在写如何分派时,发生了一段小插曲。分派原则 首先,明确一下分派的原则,如果处理器声明能处理的类型是:string,int 那么只有当对象数组的长度为2,并且类型分别为string和int时,才会分派到这个处理器上去执行,不过,要注意的一点是,string是引用类型,因此值可以为null,最终,声明为string,int的处理器可以接受下列参数:"aaa",123n
阅读全文
IL入门之旅(三)——Dump对象
摘要:Dump对象 一个成熟的系统,都少不了一个强大的Log,而Log通常需要把当时的对象的很多信息记录下来,因此Dump对象的功能在很多场合下都会使用到。 那么来看看普通的Dump如何实现: 如此,就把Foo实例的内容记录到Log中,但是,思考一下,如果有100多个地方需要记录Foo对象,就...
阅读全文
IL入门之旅(二)——动态包装
摘要:1.包装与为什么要包装 oo的世界看起来很完美,但是也有不少缺点,尤其是遇到静态语言(例如:c#,java等),经常会受制于类型不匹配这样的问题。 例如,某个类库需要一个INamedObject对象,而另一个类库仅仅提供了一个Thread对象,怎么办哪?在不可能修改类库的情况下,通常就会写一个Wrapper,把Thread包装成INamedObject,大概的代码如下: 这样就把一个Threa...
阅读全文
IL入门之旅(一)——创建对象
摘要:1.创建对象的方式 作为入门的第一篇,先从最简单的创建对象开始吧。 首先,回顾一下,在c#中如何创建某个类型的对象,最基础的当然是使用new关键字,例如:new object(),当然这个方式也有缺点,那就是编译时必须明确的知道类型(也就是这里的object)。 如果编译时不知道类型,...
阅读全文
从IDataReader中读取数据实体
摘要: 现在ORM已经是一门非常成熟的技术了,相信用的人不少,加上Linq to sql和Entity Framework的推波助澜,现在还用DataSet和DataTable的人已经越来越少了,不过,如果项目里面不用ORM工具,就不得不回归到DataSet时代吗? 也许,我们没法改变项目的决策,但是,我们可以自己制造工具。 ...
阅读全文
delegate的另类玩法
摘要:阅读本文的预备知识:1、一般情况下.net中delegate的具体类型会包含一个构造函数,一个Invoke方法,一个BeginInvoke方法和一个EndInvoke方法。2、delegate可以被当成方法的载体,传入另一个方法,或者作为某个方法的返回值(参考函数式编程中的高阶函数的思想)。3、delegate可以用于需要延迟求解的目的。4、类型的显式/隐式转换5、文中使用Lambda表达式来简化...
阅读全文
如何把结构体转换成对应的byte数组
摘要:最近看到一个帖子,问的是怎么把自己定义的结构体转换成对应的byte数组,一般来说,都会想到用Marshal类来完成这个功能,其实还有一个方法也可以,那就是利用unsafe代码。 先定义假想的一个值类型:[代码] 然后,定义一个公用方法签名:Action<MyStruct, Stream>,这个是为了方便之后的几种不同方式做性能测试。 先来看看Marshal类是怎么做到的:[代码...
阅读全文
动态按照属性排序
摘要:随着实体的概念的流行,DataTable正在逐渐的淡出我们的视野,但是,有些时候,DataTable很容易做的一件事情,却让我们不得不头痛起来——按指定列排序 如果数据是来源于一个sql语句,那么,我们可以把这个问题转嫁给sql,让DB来解决这个问题。 但是,如果数据来源于某些不支持排序(例如webservice并且没有提供排序功能),或者其他复杂情况,这样就不得不依赖于.net的集合排序。可...
阅读全文
实体类复制
摘要:随着.net引入attribute,实体类在编程中的重要性已经越来越重要了,并且有越来越多的工具开始生成自己的实体类。但是这也引来了一个麻烦,每个工具生成的实体类需要各自的attribute,并且可能互相不通用。 例如:Entity Framework生成的实体类有:Serializable,DataContract,EdmEntityType等,属性有DataMember,Edm...
阅读全文
绕开频繁反射
摘要:在.net里面,反射是一个功能强大的工具,但是,这个强大功能背后却是性能的损失。尤其是频繁的反射,将降低总体性能。 为了程序运行的更快更好,有必要在频繁反射的地方添加必要的缓存,用尽量少的反射,获得必要的灵活性,而又不降低太多性能。 说到性能,先说一下在.net中的性能排列吧,最快的是非虚方法,然后依次是虚方法、接口方法,委托,反射。前面3个的性能几乎可以忽略。委托比一般的方法...
阅读全文
泛型+反射+特性=以静制动
摘要:泛型、反射、特性都是.Net强大的功能之一,关于这3个的强大之处我就不再重复说了,今天想说的是,将这三者结合起来,组成一个强大的以静制动、以不变应万变的方案。 这个方案,我已经通过一些实验,将它变成了真实的代码。当然如果已经有人有了类似的方案,纯属巧合。本方案的核心是将特性引入目前已经有很多人讨论过的Emit中。 方案的目的: 使用方需要知道: 1、接口ITestD...
阅读全文