将 C# 列表传递给 X++

本文关键字:X++ 列表 | 更新日期: 2023-09-27 18:30:54

在 Microsoft Dynamics AX 2012 AOT 中的 C# 项目中,我有一个返回 List 的方法,我想在 X++ 代码中引用此方法。

我最初的想法是,这应该很容易。像这样:List XppProjectList = cSharpGetProjectList.GetStringList();.但是,这并没有奏效。

在对互联网进行广泛研究后,我发现我可以使用System.Collections.ArrayList而不是List,这次它有效,但仅适用于单维集合。

应该使用 C# 集合的 X++ 代码:

public void GetProjectList()
{
    cSharpGetProjectList = new PS2010Service.CSharpGetProjectList();
    projectList = cSharpGetProjectList.GetStringList();
    length = projectList.get_Count();
    for (i = 0; i < length; i++)
    {
        info(projectList.get_Item(i));
    }
}

C# 方法返回有效的List<T>

public static List<String> GetStringList()
{
    List<String> list = new List<String>();
    list.Add("One");
    list.Add("Two");
    list.Add("Three");
    return list;
}

返回ArrayList的 C# 方法也有效

public static ArrayList GetStringList()
{
    ArrayList list = new ArrayList();
    list.Add("One");
    list.Add("Two");
    list.Add("Three");
    return list;
}

返回不起作用的多维ArrayList的 C# 方法:

public ArrayList GetStringList()
{
    ArrayList list1 = new ArrayList();
    list1.Add("One");
    list1.Add("Two");
    list1.Add("Three");
    ArrayList list2 = new ArrayList();
    list2.Add("1");
    list2.Add("2");
    list2.Add("3");
    ArrayList list = new ArrayList();
    for (int i = 0; i < list1.Count; i++)
    {
        list.Add(new string[] { list1[i].ToString(), list2[i].ToString() });
    }
    return list;
}

返回的错误是:Clr 互操作封送:不支持的类型。执行代码时出错:全局(对象),使用无效参数调用的方法信息。虽然它可以读取此ArrayList的长度并返回 3。

多维List<T>也是如此,我不会在这里发布以缩短问题。

所以我的问题是 - 如何在 X++ 代码中使用 C# 的多维列表?谢谢!

将 C# 列表传递给 X++

来自 .NET 的返回值与string[2]元素ArrayList

代码应如下所示:

System.Collections.ArrayList result = cSharpGetProjectList.GetStringList();
System.String[] netEmement;
str val1, val2;
int i;
for (i=0; i < result.get_Count(); i++)
{
    netEmement = result.get_Item(i);
    val1 = netEmement.get_Item(0);
    val2 = netEmement.get_Item(1);
}

代替 for 你也可以使用枚举器

System.Collections.IEnumerator netEnumerator = result.GetEnumerator();
while (netEnumerator.MoveNext())
{
    netEmement = netEnumerator.get_Current();
    val1 = netEmement.get_Item(0);
    val2 = netEmement.get_Item(1);
}