如何在 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++ 代码中,不返回任何对象。
谢谢
要回答有关 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
此致敬意