我想在不使用任何 .NET 语言的内置支持的情况下对值进行装箱。
也就是说,给定一个枚举值,我想要一个表示该值及其类型的引用类型对象。
这是能够从后期绑定纯 C++ 代码中传递枚举值的子目标,这是一个可能的解决方案,因此,我不是在寻找如何使用例如 C# 装箱(这很容易,并且在很多方面都无关紧要)。
以下代码产生...
c:\projects\test\csharp\hello\main.cs(6,26): error CS0122: 'System.Reflection.RuntimeFieldInfo' 由于其保护级别而无法访问
但是,使用更多记录的FieldInfo
类,这是签名所MakeTypedReference
要求的,我得到一个异常,说参数不是RuntimeFieldInfo
.
不成功的代码,实验性的,C#:
using System.Windows.Forms;
using Type = System.Type;
using TypedReference = System.TypedReference;
using MethodInfo = System.Reflection.MethodInfo;
using FieldInfo = System.Reflection.FieldInfo;
using RuntimeFieldInfo = System.Reflection.RuntimeFieldInfo;
namespace hello
{
class Startup
{
static void Main( string[] args )
{
Type stringType = typeof( string );
Type messageBoxType = typeof( MessageBox );
Type mbButtonsType = typeof( MessageBoxButtons );
Type mbIconType = typeof( MessageBoxIcon );
Type[] argTypes = { stringType, stringType, mbButtonsType };// }, mbIconType };
MethodInfo showMethod = messageBoxType.GetMethod( "Show", argTypes );
// object mbOkBtn = (object) (MessageBoxButtons) (0);
TypedReference tr = TypedReference.MakeTypedReference(
mbButtonsType,
new RuntimeFieldInfo[]{ mbIconType.GetField( "OK" ) }
);
object mbOkBtn = TypedReference.ToObject( tr );
object[] mbArgs = { "Hello, world!", "Reflect-app:", mbOkBtn };
showMethod.Invoke( null, mbArgs );
}
}
}
有助于使上述代码“工作”的答案会非常好。
指出另一种实现拳击的方法的答案(也许以上完全和完全错误? - 这只是实验性的)也将非常好!:-)
编辑:澄清:基本上我和C#(object)v
产量一样。我已经尝试过 enumToObject
方法,但不幸的是,虽然这在 .NET 中可能工作正常,但在 C++ 端,我只取回 32 位整数值。C++ 方面的问题是,将整数作为 eg 的第三个参数传递会MessageBox.Show
失败,大概是因为 .NET 方面的默认绑定器不会将其转换为枚举类型,所以我怀疑需要一个合适类型的引用对象实际论证。