私はこれらすべてのラムダと苦労しました。 (CLinqライブラリや他のものも含めて)数時間、そして...私はちょうど考えました:なぜ純粋に静的な決定を使わないのですか?
私達はちょうど
/// Convert X to "X", the classical preprocessing trick
#define GetPropName(TheClassName, ThePropertyName) #ThePropertyName
を宣言し、我々は、画面に印刷された "ID" を取得するために
Console::WriteLine(GetPropName(TimeZone, Id));
を行うことができます。
ええと...今興味深い部分です。型の安全性。私は、この解決策についてコメントの嵐が聞こえるのを聞いています(「いいえ、これは良くないです、ThePropertyNameがクラスにあるかどうかをチェックしません」)。
OK。解決策:ダミーのTheClassNameのインスタンスでThePropertyNameを使用するマクロを使用して、無意味なコードを生成してみましょう。
using namespace System;
/// Sample class
public ref class TheTimeZone
{
public:
TheTimeZone()
{
_Id = 0;
_DisplayName = "tmp";
}
property int Id
{
public:
int get() {return _Id;}
void set(int v) { _Id = v; }
}
property String^ DisplayName
{
public:
String^ get() { return _DisplayName; }
void set(String^ v) { _DisplayName = v; }
}
private:
int _Id;
String^ _DisplayName;
};
/// This macro will produce the error if ThePropertyName is not in the class named TheClassName
#define CheckForPropertyExistence(TheClassName, ThePropertyName) \
/* Create an array of Objects which will be converted to string and ignored*/ \
(gcnew array<System::Object^> { (gcnew TheClassName())->ThePropertyName })->ToString()
/// We get the property name using the "dinosaur strategy":
/// good old macro concatenated with the empty string
/// which in turn is formed in CheckFor() macro
#define GetPropertyName(TheClassName, ThePropertyName) \
(gcnew System::String(#ThePropertyName)) + \
CheckForPropertyExistence(TheClassName, ThePropertyName)->Substring(0,0)
/// To get properties from objects with no default constructor
#define GetPropertyNameForObject(TheObject, ThePropertyName) \
(gcnew System::String(#ThePropertyName)) + \
(gcnew array<System::Object^> { (TheObject)-> ThePropertyName })->ToString()->Substring(0,0)
/// Test for our macros
int main(array<System::String ^> ^args)
{
/// Prints "Length"
/// We cannot use default constructor here
Console::WriteLine(GetPropertyNameForObject (gcnew System::String("test"), Length));
/// Prints "Id"
Console::WriteLine(GetPropertyName (TheTimeZone, Id));
/// Uncomment and get the error
//Console::WriteLine(GetPropertyName (TheTimeZone, Id23));
return 0;
}
かなり美しい/ハッキー...あなたはCheckForPropertyExistenceを '1で装飾できませんでしたか? NULL:yourcode'を実行時に作成するオブジェクトが2つ少なくなりました。 – xanatos
@ xanatos:はい、いい考えです。 3年が経過した、私はオブジェクトを作成するための正確な推論を覚えていない。たぶん "解決策が見つかりました!"あなたが提案するように興奮が私の行為を妨げました。 –