Using Arrays

An array is a data structure that contains several variables of the same type. The variables are treated as a single collection. Although you can already create arrays in C/AL, you can now use arrays from the .NET Framework. Choosing whether to use a C/AL array or a .NET Framework array depends on how you intend to use the data.

For this scenario Use this array type

Your C/AL code uses .NET Framework interoperability extensively, and you must share the array among many methods.

.NET Framework array

Your C/AL code mostly uses basic C/AL types and does not interoperate with the .NET Framework.

C/AL array

To use a .NET Framework array in C/AL, you must use the System.Array class in the .NET Framework class library, which is the class from which all arrays inherit. When interfacing with an array in C/AL, you must use the following methods of the System.Array class to create and access elements in the array.

Method Description

CreateInstance

Creates a new array instance that is passed to a method or property.

SetValue

Sets a value in an array element.

GetValue

Gets a value from an array element

Many .NET Framework classes implement these methods. Therefore, they are available for you to use in C/AL code. If you are writing your own .NET Framework code and want to use it in Microsoft Dynamics NAV, then you must implement these methods yourself.

In C/AL, some .NET Framework data types, such as strings, integers, and decimals, are automatically converted to C/AL types. If a .NET Framework array contains these data types, then you create an assembly that contains methods that return the information about the data types and then reference the assembly in the C/AL code. This concept is illustrated in the following examples.

Example: Using Native C/AL Data Types in a .NET Framework Array

The following example shows how you can use a .NET Framework array for an integer data type.

  1. In Visual Studio, create a C# class library project called NavInteropHelper that contains a method that returns the information about the integer type as follows:

    namespace Microsoft.Dynamics.Nav.NavInteropHelper;
    {
        public class WrapInt32
        {
            public static Type GetTypeOfInt32()
            {
                return typeof(Int32);
            }
        }
    }
    
  2. Build the project, and then copy the assembly to the Add-ins folder of the Microsoft Dynamics NAV Windows client installation folder. By default, the path of the installation folder is C:\Program Files\Microsoft Dynamics NAV\70\RoleTailored Client or C:\Program Files (X86)\Microsoft Dynamics NAV\70\RoleTailored Client.

  3. In the development environment, open a Microsoft Dynamics NAV object, open the C/AL code, and then create the following C/AL variables.

    Variable name DataType SubType

    varDotNet

    DotNet

    'NavInteropHelper, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.Microsoft.Dynamics.Nav.NavInteropHelper.WrapInt32

    varArray

    DotNet

    'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array

    arraySize

    Integer

    i

    Integer

    alData

    Integer

  4. On a trigger of the Microsoft Dynamics NAV object, add the following C/AL code to create, fill, and implement the array.

    // Sets the number of elements in the .NET Framework array.
    arraySize := 10;
    // Creates an instance of the .NET Framework array that contains the Int32 type.
    varArray := varArray.CreateInstance(varDotNet.GetTypeOfInt32(), 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,i);
    // Gets the array data and validates the content. The object that is returned by
    // GetValue is automatically converted into a C/AL integer in the assignment.
    FOR i := 0 TO (arraySize -1) DO
    BEGIN
      alData := varArray.GetValue(i);
      if alData <> (i+100) then
        error('Invalid array data in element %1, expected %2, actual %3', i, i+100, alData);
    END;
    

Example: Using User-Defined Classes in a .NET Framework Array

This example shows how you can use a .NET Framework array that includes user-defined classes.

  1. In Visual Studio, create a C# class library project called NavInteropHelper that contains methods that return the information about the types as follows.

    namespace Microsoft.Dynamics.Nav.NavInteropHelper;
    {
        public class WrapInt32
        {
            public int Data { get; set; }
            public WrapInt32(Int32 value)
            {
                Data = value;
            }
        }
    }
    
  2. Build the project, and then copy the assembly to the Add-ins folder of the Microsoft Dynamics NAV Windows client installation folder. By default, the path of the installation folder is C:\Program Files\Microsoft Dynamics NAV\70\RoleTailored Client or C:\Program Files (X86)\Microsoft Dynamics NAV\70\RoleTailored Client.

  3. In the development environment, open a Microsoft Dynamics NAV object, open the C/AL code, and then create the following C/AL variables.

    Variable name DataType SubType

    varDotNet

    DotNet

    'NavInteropHelper, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.Microsoft.Dynamics.Nav.NavInteropHelper.WrapInt32

    varArray

    DotNet

    'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array

    arraySize

    Integer

    i

    Integer

    alData

    Integer

  4. On a trigger of the Microsoft Dynamics NAV object, add the following C/AL code to create, fill, and implement the array.

    // Sets the number of elements in the .NET Framework array.
    arraySize := 10;
    // Creates an instance of the .NET Framework object so the type information can be retrieved.
    varDotNet := varDotNet.WrapInt32(1);
    // Creates an instance of the .NET Framework array that contains the user-defined type.
    varArray := varArray.CreateInstance(varDotNet.GetType(), arraySize);
    // Clears the object instance because it is no longer used.
    clear(varDotNet);
    // Sets data in the array.
    FOR i := 0 TO (arraySize -1) DO
    BEGIN
      varDotNet := varDotNet.WrapInt32(i+100);
      varArray.SetValue(varDotNet,i);
    END;
    // Gets array data and validates content.
    FOR i := 0 TO (arraySize -1) DO
    BEGIN
      varDotNet := varArray.GetValue(i);
     // Gets the integer value from the .NET Framework object using the Data property. 
      alData := varDotNEt.Data;
      if alData <> (i+100) then
        error('Invalid array data in element %1, expected %2, actual %3', i, i+100, alData);
    END;