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名.
09-10
1344

05-03
112

05-02
177

05-02
284

05-02
96

04-27
430

04-18
290

04-11
223


2504d,12月会议
04-10
198


2025,倪五书的地址
04-01
166

03-28
247

03-26
99

03-25
208

03-20
119


2503d,d111更改
03-11
985

03-07
196


2503,D比C更易重构
03-04
340

02-26
238

02-22
196

02-13
172
