C#中的dynamic关键字在C++ CLI中有什么等价物?

6

有两个项目,一个是C++ CLI,另一个是C#。
C#项目引用了C++ CLI项目。

我想在C#中做到这一点:

//method signature is somemethod(dynamic data);
somemethod("haaaii");

现在必须在C++ CLI项目中处理这个方法。

如何在C++ CLI中声明此方法?
还有如何检测数据类型在C++ CLI中?


你具体使用的是哪个版本的C++和C#? - Security Hound
@Ramhound C++ CLI是随Visual Studio 2012一起提供的,而C#则是随Visual Studio 2010一起提供的。 - Mohsen Sarkar
1
秘密的关键在于你无法直接看到的地方,编译器使用的绑定剂将C#语句与DLR结合起来。这非常不平凡。VB.NET有它,C# v4有它。C++/CLI没有它,也永远不会有。 - Hans Passant
@HansPassant 你的意思是我不能做被要求的事情吗? - Mohsen Sarkar
@Mahdi:不,你必须自己将事物连接起来,编译器不会帮忙。 - Ben Voigt
显示剩余3条评论
2个回答

6
为了获得C#视为“dynamic”的方法签名:
void TestMethod( [System::Runtime::CompilerServices::DynamicAttribute] System::Object^ arg )
{
}

但是如果你只想接受所有类型,你可以简单地使用 System::Object^。该属性是误导的,因为它暗示了你将会非常难以提供的语义。

要发现实际的数据类型,请使用 arg->GetType()。然后,您可以使用反射和/或 DLR 的全部功能在运行时发现并调用成员。

更有用的是在返回类型上使用属性,因为这样当使用 var 关键字时,C# 将会推断出 dynamic 语义。

[returnvalue: System::Runtime::CompilerServices::DynamicAttribute]
System::Object^ TestReturn( void )
{
    return 1;
}

这非常感谢;你节省了我很多时间;非常感谢你。 - Mohsen Sarkar

0
你可能需要使用 System::Dynamic::DynamicObject 类型进行动态获取。

void somemethod(ref System::Dynamic::DynamicObject data) { }


我已经尝试过了,但没有成功。似乎DynamicObject需要引用Linq - Mohsen Sarkar
2
更可能是 System::Dynamic::DynamicObject^。不,它不应该需要使用LINQ。但是您需要引用包含在 System.Core.DLL 程序集中的 DLR。 - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接