关于.net中IL语言的一个应用场景 2014-2-10 17:15 阅读(0)

本文介绍如何使用IL语言解决C#中无法直接创建基于枚举类型泛型类的问题,通过IL语言编写代码实现了一个泛型类String<T>,其中T为枚举类型,并成功编译为DLL供C#调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


  首先,不得不承认,我们很少需要IL语言,但有时使用IL语言会让你的设计变得很合理,当然,如果对IL这种语言有抵触的可以绕道。

         在实际编程中,有许多变量的值可能来自于一组已知的值,同时又提供必要的自定义值,以提供扩充可能,基于此种需求,打算设计一个String<T>类,其中范型参数为一枚举变量,该类提供字符串与枚举量两种构造方式(我不想为每个可能的对象都编写一个类,我只想定义一个枚举,如果要定义类的可以绕道)。残酷的是C#不支持定义一个范型,其参数来自Enum的约束,后来又偿试了托管C++,很遗憾,继续不提供支持。对于其它托管语言,没有进一步去偿试,果断选作IL作为这个类的开发语言,其示例代码如下:

.class public auto ansi beforefieldinit String`1<([mscorlib]System.Enum)T>

          extends[mscorlib]System.Object

    {

 

        .field public string _value

        .method public hidebysig specialname rtspecialname

          instance void  .ctor(string v) cil managed

         {

            // 代码大小       24 (0x18)

            .maxstack  8

            IL_0000:  ldarg.0

            IL_0001:  ldnull

            IL_0002:  stfld      string class Inm.Text.String`1<!T>::_value

            IL_0007:  ldarg.0

            IL_0008:  call       instance void[mscorlib]System.Object::.ctor()

            IL_000d:  nop

            IL_000e:  nop

            IL_000f:  ldarg.0

            IL_0010:  ldarg.1

            IL_0011:  stfld      string class Inm.Text.String`1<!T>::_value

            IL_0016:  nop

            IL_0017:  ret

         } //end of method String`1::.ctor

 

    }

编译成DLL后,经C#调用,完美解决问题。

(大部分IL代码可以通过先编写相关的C#类经反射生成,其它的代码可经VS的一个扩展ILSupport编写,目前该扩展只支持到VS2012,要想支持VS2013,需修改VSIX安装文件中的vsixmanifast文件)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值