如何在 MS Dynamics AX 2012 中使用 X++ 列表封送 C# 列表

本文关键字:列表 X++ MS Dynamics 2012 AX | 更新日期: 2023-09-27 18:35:34

我有一个MS Dynamics AX 2012项目,我正在使用.Net互操作。static class中有一个名为 Database 的 C# 方法:

 public static List<String> GetAllDatabases(string dataSource)

引用此程序集后,我可以用 X++ 执行:

ADOMD.ADOMD.Model.Database::GetAllDatabases();

但是我无法读取它返回的字符串列表。我想使用类似的东西:

List databaNameCollection = new List( Types::String ); 
;
databaNameCollection =  ADOMD.ADOMD.Model.Database::GetAllDatabases();

但它会发现一个错误:

Error executing code:  (object) has no valid runable code in method 'GetSID'.

我该怎么做?

-------编辑------

我找到了这篇文章:

http://blogs.msdn.com/b/x/archive/2010/01/19/traversing-elements-in-an-ienumerable-from-x.aspx

但那是在 2010 年,可能是 AX 2009,我试图分配:

ClrObject enumerator; 
str theValue;
;
enumerator = ADOMD.ADOMD.Model.Database::GetAllDatabases();
while (enumerator.MoveNext()) 
    { 
        theValue = enumerator.get_Current(); 
        print theValue; 
    } 

GetallDatabases 方法正在与另一个 .Net 项目一起使用,它返回 10 个对象,但在 X++ 代码中,不返回任何对象。

谢谢

如何在 MS Dynamics AX 2012 中使用 X++ 列表封送 C# 列表

要回答有关 X++ 中的 .NET 类型的问题,get_{x}set_{x}

.NET 属性在 X++ 中显示为方法。例如,C# 中的 get & set 属性

string Name {get;set;}

将在 X++ 中显示为

string get_Name();
void set_Name(str value);

基本上,C# 属性只是语法糖。C# 编译器将为每个 get 属性创建一个 get_{x} 方法,并为每个集合属性创建一个 set_{x}。

在您的情况下,如果要访问 cubeDef 对象中的 Name 属性,则必须在 X++ 中编写如下内容:

info(cubeDef.get_Name());

我使用以下示例制作了它: http://blogs.msdn.com/b/x/archive/2010/01/19/traversing-elements-in-an-ienumerable-from-x.aspx

但是如果没有enumerator.MoveNext(),因为它不是 X++ 对象,因此将其更改为 for 循环是有效的,最终代码是:

ClrObject enumerator;  
str theValue;
int i;
int length = 0; 
List databaNameCollection = new List( Types::String );
;  
try
  { 
    permission = new InteropPermission(InteropKind::CLRInterop);
    if (permission == null)
    {
            return;
    }
    permission.assert();
    enumerator = ADOMD.ADOMD.Model.Database::GetAllDatabases();
    length = enumerator.get_Count();
    for (i = 0; i < length; i++)
    {
        stringElement = enumerator.get_Item(i);
        databaNameCollection.addStart(stringElement);
    }
     CodeAccessPermission::revertAssert();
 }
 catch (Exception::CLRError)
 {
     CodeAccessPermission::revertAssert();
     info(CLRInterop::getLastException().ToString());
 }

但仍然存在一些问题

1) 我无法直接分配databaNameCollection.addStart(enumerator.get_Item(i));

2)我无法访问复杂对象属性,例如:

cubeDef  = enumerator.get_Item(i);
info(cubeDef.Name);

其中cubeDef的类型为:Microsoft.AnalysisServices.AdomdClient.CubeDef

3)我找不到描述这些get_{propertyName}方法的CLRObject文档。例如:get_Item

此致敬意