2

我有一个 MS Dynamics AX 2012 项目,我正在使用 .Net 互操作。static class在被调用的内部有一个 C# 方法Database

 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++ 代码中,没有返回任何内容。

谢谢

4

2 回答 2

2

要回答有关 X++ 和get_{x}and中 .NET 类型的问题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 属性创建一个 set_{x}。

在您的情况下,如果您想访问NamecubeDef 对象中的属性,您必须在 X++ 中编写类似这样的内容:

info(cubeDef.get_Name());
于 2012-06-05T05:06:38.513 回答
0

我使用以下示例制作它: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) 我找不到描述这些方法的CLRObject的文档。get_{propertyName}前任:get_Item

最好的祝福

于 2012-05-29T08:54:47.913 回答