좋아, 내가하려고하는 것은 요정이 복잡하지만 설명하려고 노력할 것입니다.문자열에서 클래스 가져 오기 - 문자열 이름으로 함수 호출
someClass
의 derivedMembers
을 모두 (컴파일 타임에) 원한다고 가정 해 봅시다. 그런 다음 우리는 간단하게 할 거라고 :
const string[] methods = [__traits(derivedMembers,someClass)];
, 우리가 어떻게 "someClass"
에서 someClass
을 얻을 수 있을까? (예, 해당 문자열 표현).
나를 조금 더 내가 할 노력하고있어 설명하자
을 내가 (A PARAMS 배열과 함께) 인수로 function
이름을 취하는 "중간"기능을 만들려하고 특정 (미리 정의 된) 클래스 집합에서 사용 가능한 정적 메서드 목록에서 적절한 함수를 호출합니다. execute("someFunc",["one","two","three"]);
처럼.
class Math {
static string noArgs(string[] s) { writeln(s); return ""; }
static string withOneArg(string[] s) { writeln(s); return ""; }
static string withTwoArgs(string[] s) { writeln(s); return ""; }
}
string cases()
{
string ret = "";
const string[] methods = [__traits(derivedMembers,Math)];
foreach (string s; methods)
{
ret ~= "case \"" ~ s ~ "\": return Math."~s~"(params);";
}
return ret;
}
string execute(string what, string[] params)
{
switch (what)
{
mixin(cases());
default: break;
}
return "";
}
위의 코드의 문제점은 단지 Math
의 방법을 찾는 것입니다 :
다음은 전체 (검사) 코드입니다. 어떻게 우아하게 D- 친숙한 방식으로 변경하여 [Math,String,SomethingElse]
과 같은 클래스 배열을 통해 갈 수 있습니다 - 가변적 일 필요는 없습니다 (어쨌든 컴파일 타임에 필요합니다)?
UPDATE :의 라인을 따라
시도 뭔가 :
const string[] methods = [__traits(derivedMembers,mixin("Math")];
있지만 Cannot interpret Math at compile time
있음을 뿌려줍니다.
업데이트 2 : 또한
는 Object.factory("Math")
를 사용하여 시도하지만 여전히 작동하지 않습니다. (아마도 난 그냥 Math
클래스의 인스턴스를 만드는거야?)
'Object.factory ("com.example.kameleon.Math");'와 같은 정규화 된 이름으로 시도 했습니까? – DejanLekic
@DejanLekic'mixin (className)'을 사용하여 그 부분을 해결 한 것 같습니다 (마침내 효과가있었습니다). 그러나 그것은 아직도 ok가 아니다. 여기를보십시오 : http://stackoverflow.com/questions/23078009/use-a-loop-at-compile-time –
Object.factory는 나중에 인스턴스를 다시 캐스팅하거나 인터페이스를 통해 사용할 수 있도록 인스턴스를 만듭니다. 그것은 비록 컴파일 시간 반영을 위해 유용하지 않습니다. –