2014-03-25 70 views
2

我想創建一個將應用於classDeclarations的自定義屬性。我可以枚舉類的其他方法的屬性,但不能枚舉classDeclaration本身,因爲它是某種特殊方法如何使用反射從類聲明中檢索屬性

我知道這是可能的,因爲SysObsoleteAttribute(從內核調用)放在classDeclarations中。

Classes\CustCustomerService\create我剛剛複製了這個測試的頂部Classes\CustCustomerService\classDeclaration屬性。

[AifDocumentCreateAttribute, SysEntryPointAttribute(true)] 
class CustCustomerService extends AifDocumentService 
{ 

} 

我上了一個新類中創建一個靜態方法:

static public void AttribsOfSysEntryPointAttributeOnMethod 
      (
      str _sNameOfClass, 
      str _sNameOfMethod, 
      str _nameOfAttribute 
      ) 
{ 
    int nClassId; 

    SysDictMethod  sdm; 
    Object attributeAsObject; 
    SysDictClass   sysDictClass; 

    Array     attribArray = new Array(Types::Class); 
    int i; 

    nClassId = Global::className2Id(_sNameOfClass); 

    sysDictClass = new SysDictClass(nClassId); 

    sdm = new SysDictMethod(UtilElementType::ClassInstanceMethod, nClassId, _sNameOfMethod); 

    attribArray = sdm.getAllAttributes(); 

    if (attribArray) 
    { 
     for (i=1; i<=attribArray.lastIndex(); i++) 
     { 
      attributeAsObject = attribArray.value(i); 

      info(strFmt("[%3] Attrib Class Id: %1 [%2]", classIdGet(attributeAsObject), classId2Name(classIdGet(attributeAsObject)), _sNameOfMethod)); 

     } 
    } 
    else 
    { 
     // Unable to get attributes, try another way 
     error(strFmt("Unable to retrieve attribute array for method %1", sdm.name())); 

     // It is, so let's try and enumerate ALL attributes and output them directly from class dec 
     sdm = sysDictClass.objectMethodObject(1); 

     if (attribArray) 
     { 
      for (i=1; i<=attribArray.lastIndex(); i++) 
      { 
       attributeAsObject = attribArray.value(i); 

       info(strFmt("[%3] Attrib Class Id: %1 [%2]", classIdGet(attributeAsObject), classId2Name(classIdGet(attributeAsObject)), _sNameOfMethod)); 

      } 
     } 
     else 
      error(strFmt("Still unable to retrieve attribute array for method %1", sysDictClass.objectMethod(1))); 
    } 
} 

然後創建一個作業來調用它,你可以看到它是如何工作的一個方法,而不是其他。

static void Job5(Args _args) 
{   
    AttributeReflection::AttribsOfSysEntryPointAttributeOnMethod("CustCustomerService", "create", "SysEntryPointAttribute"); 
    AttributeReflection::AttribsOfSysEntryPointAttributeOnMethod("CustCustomerService", "classDeclaration", "SysEntryPointAttribute"); 

} 

任何想法如何枚舉classDeclaration屬性?

回答

1

classDeclaration不是一種方法,不能被調用。因此,您的sysDictClass變量爲空。

Googling揭示,getAllAttributes方法退出上DictClass

attribArray = sdm ? sdm.getAllAttributes() : sysDictClass.getAllAttributes(); 
+0

AH神奇。所以它是一個類級別的屬性而不是方法級別。我的'sysDictClass'變量不是null,也許你的意思是'attribArray'變量。 –