d替换工厂模式
因为正在弃用Object.factory()
,这里,因此需要方便的替代方案.
TraitsExpression:
__traits ( getModuleClasses [, TraitsArgument] )
特征参数
是模块名
或全限定导入
.
如果未指定TraitsArgument
,则默认为当前模块
.
它返回表示指定模块
中定义的全限定类
的串元组
.
如:
module test;
import std.stdio;
class C { }
pragma(msg, __traits(getModuleClasses));
pragma(msg, __traits(getModuleClasses, std.stdio);
//打印
tuple("test.C")
tuple("std.stdio.Stdio.Exception")
可附加".classinfo"
到这些串
中,以取这些模块
的类信息
.
见这里
我不得不说,我对该方法并不信服,原因有二:更通用的过滤
方法要好得多.
__traits(getMembers, symbolOrModule, function/class/struct/union/field)
__特征(取成员,符号或模块,函数/类/构/联/字段)
将是非常有用的,且允许显著简化
现有逻辑.
用例:注册Web
路由,ORM,CLI
处理.
但是该特征
不按当前运行时moduleinfo
那样工作,不是吗?
pragma(msg, __traits(getModuleClasses)); // A?
static if (cond) class B {}
pragma(msg, __traits(getModuleClasses)); // A, B?
class A { }
enum cond = true;
以上只是为了说明
,可能有traits
根据排序(结构成员
列表中的特征
)产生不同的结果
的更好的/实际的
示例,但目前没有编译器
来测试.
它产生:
tuple("B", "test2.A")
tuple("B", "test2.A")
如下会给你(更有用)实际类型
.我用了5分钟就写好了
template AllClasses(alias mod) {
import std.meta : AliasSeq;
alias result = AliasSeq!();
static foreach(m; __traits(allMembers, mod))
static if(is(__traits(getMember, mod, m) == class))
result = AliasSeq!(result, __traits(getMember, mod, m));
alias AllClasses = result;
}