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名.
posted @   zjh6  阅读(18)  评论(0编辑  收藏  举报  
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示