原文
我想用类型系统(客户端和服务器
代码)来建立REST
接口.
struct Request
{
Method method;
string url;
int apiLevel;
}
@Request(Method.GET, "/my-resource/%s", 1)
struct MyResourceGet
{
@Param
string name;
// 其他成员...
}
string requestUrl(ReqT)(ReqT req) if (isRequest!ReqT)
{
import std.format : format;
import std.traits : getSymbolsByUDA;
Request reqAttr = RequestAttr!ReqT;
alias paramSymbols = getSymbolsByUDA!(ReqT, Param);
// return format(reqAttr.url, ????);
}
unittest
{
MyResourceGet req;
req.name = "thisone";
assert(requestUrl(req) == "/my-resource/thisone");
}
在requestUrl
函数中,如何从paramsSymbols
和req
中取req.name
的值?
这样用
getUDAs!(req, Param).length == 0
吗?但仅对构
而非字段
属性.
从符号取,要用递归
.即必须先查找UDA
,然后使用getUDA
.
我不需要uda
值,只需要用uda
装饰字段的值.
我用
__traits(getMember, req, paramSymbols[0].stringof)
得到了.
stringof
仅用于调试,因为可能
不一致,你可以用__traits(identifier)
.