d语言编译时反射.

import std.stdio;
import std.conv;
import std.traits;
//还可以更酷
class MyNewClass:Reflectable{
    mixin CallImplementation;
}//插件一下就有了.

class MyClass {
    void myMethod() {}
    int anotherMethod(int a) { return a; }
    //编译时反射,自动生成,运行时桥函数
    string call(string 方法名,string[]args){
        方法开关:switch(方法名){//所有可重载
            //方法开关,是个标签,可以从内部直接断开
        //开关//内部使用静断
        static foreach(成员; __traits(allMembers, typeof(this))) {//所有成员名
            case 成员:{//过滤所有可调用
            //子类,普通数据成员...
            static if(isCallable!(__traits(getMember,this,成员))) {
                //类似普通的`&成员.方法`
            auto callable=&__traits(getMember,this,成员);//可调用->取闭包
            Parameters!callable arguments;
            //特征里面有某某的参数对象
            foreach(i, ref arg; arguments) {
                //设置参数成员,因而引用循环
                //运行时->串->实际方法参数
                //自动转换不行
                //技巧:__traits(compiles),
                //成功编译,则为真
                //用静如块,编译时异常=>运行时错误
                static if(__traits(compiles, to!(typeof(arg))(args[i])))
                    arg = to!(typeof(arg))(args[i]);
                //to,转换,如失败,会抛错误
                else//未编译
                    throw new Exception("方法"~方法名~"不匹配参类型");
            }
            //处理返回值,空,特例(单独处理)
            //调用参数,返回串(值)
            static if(is(ReturnType!callable == void)) {
                callable(arguments);return null;
            }else{
                return to!string(callable(arguments));
            }//转成串
            }
            }
            break 方法开关;//断;成员内
        }//方法开关是个标签.
        default:
            throw new Exception("无此"~方法名);
        }
        assert(0); //不可达
    }
}

//.去空格.免得异常
void main() {
    auto obj = new MyClass();
    writeln(obj.call("myMethod", []));
    writeln(obj.call("anotherMethod", ["5"]));
}//call为反射
//.close,顶级符号.如本地具有个close,而最顶级模块有个其他函数的close,但全名太长,这时就可以使用这个.其不在本地模块查找close名.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值