【问题标题】:Setting values to Arrays in Dynamics NAV 2018在 Dynamics NAV 2018 中将值设置为数组
【发布时间】:2020-03-28 20:01:51
【问题描述】:

我用 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 的调用失败并显示以下消息:对象无法存储在此类型的数组中。

我已经被这个问题困扰了好几天了。任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

    Nav 正在处理的所有内容都是 Object 类内部的 wrapped。因此,当您编写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 中的语义。

    【讨论】:

    • 感谢您的帮助。您的意见帮助我看到了我错在哪里
    【解决方案2】:

    有了@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
    

    这样,我就可以在数组中存储值了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      • 2012-04-06
      • 1970-01-01
      相关资源
      最近更新 更多