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名.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现