好吧,我还没有找到一些说这是不可能的事情,尽管我开始认为这可能是。你能做到这一点吗?
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);
}
更新:从代码生成宏调用unset,该宏在大约50个参数上调用。我宁愿不必为每种类型制作各种宏。
答案 0 :(得分:3)
这是不可能的。设置属性需要调用属性setter函数。没有办法猜测它需要调用函数vs的被调用方法可以分配传递的变量指针。如果你真的想这样做,那就传递一个代表。
实际上有一种.NET语言支持它,VB.NET生成这样的代码:
T temp = obj->prop;
func(temp)
obj->prop = temp;
然而,有一个可怕的别名问题,非常难以辨认。这种情况在func()也使用该属性的(罕见)情况下变得很糟糕。否则,这是您在限制中解决的问题,明确地在您自己的代码中。
请注意您的代码是错误的,可能是有意的,您正在传递C ++&amp;引用,而不是托管%内部指针。编译器会对此感到厌烦,您无法创建对托管对象的引用或指针。他们搬家了。除非引用是堆栈上的变量。它没有改变答案。
答案 1 :(得分:0)
对于那些可能最终想知道我是如何继续这样做的人,我最终很幸运,我正在使用的课程是一个LLBLGen实体,所以我能够取代
unset(re->var);
与
{ SD::LLBLGen::Pro::ORMSupportClasses::IEntityField2^ f = re->Fields[#var]; \
if (f->IsNullable) \
f->CurrentValue = nullptr; }