2011-03-31 66 views
0

嗯,我還沒有找到說這是不可能的東西,但我開始認爲它可能是。你能做這個工作嗎?C++/cli引用屬性

using namespace System; 

template <typename T> 
void unset(Nullable<T>& var) { var = Nullable<T>(); } 
void unset(String^% var) { var=nullptr; } 

//this is really a C# class in my situation, so I can't change its types 
public ref class Foo 
{ 
public: 
    property Nullable<Decimal> Dec; 
    property Nullable<int> Num; 
    property String^ Str; 
}; 

int main() 
{ 
    Foo^ foo = gcnew Foo; 
    foo->Dec = Decimal(1.2); 
    foo->Num = 3; 
    foo->Str = "hi"; 

    unset(foo->Dec); 
    unset(foo->Num); 
    unset(foo->Str); 

    Console::WriteLine(foo->Dec); 
    Console::WriteLine(foo->Num); 
    Console::WriteLine(foo->Str); 
} 

更新:從代碼生成宏調用約50個參數調用unset。我寧願不必爲每種類型製作宏的變體。

回答

3

這是不可能的。設置屬性需要調用屬性設置器功能。沒有辦法猜測它需要調用函數的被調用方法,也可以分配傳遞的變量指針。如果你真的想這樣做,然後通過一個委託。

其實是有支持它的一個.NET語言,VB.NET產生這樣的代碼:

T temp = obj->prop; 
    func(temp) 
    obj->prop = temp; 

然而,有一個可怕的別名問題與得挺undebuggable。這在func()也使用該屬性的情況下很罕見(罕見)。否則,您可以在自己的代碼中明確使用這種限制。

請注意,您的代碼錯誤,可能是故意的,您傳遞的是C++ &引用,而不是託管的%內部指針。編譯器會討厭這個,你不能創建引用或指向託管對象的指針。他們移動。除非引用是堆棧上的變量。它不會改變答案。

+0

感謝您的信息。我沒有寫出原始代碼,不認爲&必然是有意的,但是這個示例編譯時沒有警告。不作爲答案,但因爲我有我的手指交叉,有一個解決方案:) – Thomas 2011-04-01 11:54:16

+0

如果你不認爲這是答案,然後我做了一個非常糟糕的工作,解釋爲什麼這是不可能的。那麼你不應該將它標記爲答案。 – 2011-04-01 12:11:19

+0

嗯,我的希望是基於獲得Set函數的訪問權限,我現在相當肯定是不可能的。 – Thomas 2011-04-01 12:18:35

0

對於那些誰可以在這裏結束想知道如何得到關於這一點,我最終被幸運,我正在同階級是一個LLBLGEN實體,所以我能夠來取代

unset(re->var); 

{ SD::LLBLGen::Pro::ORMSupportClasses::IEntityField2^ f = re->Fields[#var]; \ 
    if (f->IsNullable) \ 
     f->CurrentValue = nullptr; }