在Dynamics NAV 2018中将值设置为数组

时间:2019-12-04 04:19:49

标签: c# .net microsoft-dynamics dynamics-nav language-interoperability

我使用以下类定义在C#中构建了一个类库application-dll:

namespace Microsoft.Dynamics.NAV.NAVInteropHelper
{
   public class WrapDecimalConvert
   {
      public static Type GetTypeofDouble()
      {
        return typeof(decimal);
      }
   }
}

我将dll添加到了应用程序中,在全局变量中声明了以下变量

Name      DataType    Subtype   Length
varArray  DotNet    System.Array.'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'  
varDotNet DotNet    Microsoft.Dynamics.Nav.NavInteropHelper.WrapDecimalConvert.'NavInteropHelper, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'    

然后在我的代码中,我有以下

arraySize := 10; 
// Creates an instance of the .NET Framework array that contains the decimal type.  
varArray := varArray.CreateInstance(GETDOTNETTYPE(varDotNet.WrapDecimalConvert()), arraySize);
// Clears the object instance because it is no longer used.  
CLEAR(varDotNet); 
// Sets the data in the array.
FOR i := 0 TO (arraySize -1) DO
varArray.SetValue(i+100.0,i);

一切似乎都很好,但是在调用该函数时,出现了此错误

  

对Microsoft.Dynamics.Nav.Runtime.NavDotNet []。SetValue的调用失败,并显示以下消息:无法将对象存储在这种类型的数组中。

我已经坚持了好几天。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

假设由于某种原因Dimensions不适合您。

Nav处理的所有内容都是wrapped在Object类内部。因此,当您编写varArray.SetValue(i+100.0,i);时,i+100.0不是十进制,而是对象。您可以尝试在Nav中定义类型dotnet子类型Decimal的变量并为其赋值,然后将此变量传递给数组。

dec := i+100.0;
varArray.SetValue(dec, i);

此外,我认为,您可以使用以下方法摆脱外部库中的类型包装器。

Tp  DotNet  System.Type.'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'

Tp := Tp.GetType('System.Decimal, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089');

虽然不太清楚GetType内部的语义。

答案 1 :(得分:0)

@Mak Sim的输入, 我替换了

// Creates an instance of the .NET Framework array that contains the decimal type.  
varArray := varArray.CreateInstance(GETDOTNETTYPE(varDotNet.WrapDecimalConvert()), arraySize);

 // Creates an instance of the .NET Framework array that contains the decimal type.  
 varArray := varArray.CreateInstance(GETDOTNETTYPE(initDec), arraySize);
 // where initDec is decimal variable

有了它,我能够将值存储在数组中。