2011-03-31 50 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; }