2015-04-17 37 views
1

有了MATLAB,可以動態屬性添加到一個類的實例是這樣的:檢索動態屬性列表中添加類在MATLAB OOP

% Define a class supporting for dynamic properties 
classdef DynamicClass < dynamicprops 
end 

% Add a dynamic property named 'toto' to some instance 
c = DynamicClass(); 
c.addprop('toto'); 

無論如何,我沒有找到一個方法來以後得到列表動態性能通過反思,的確是:

m = metaclass(c); 

返回的屬性列表爲空:

PropertyList: [0x1 meta.property] 

dynamicprops超即使上市屬性返回一個空列表:

m.SuperClassList(1).PropertyList ==> 0x1 property array 

有沒有辦法獲得(通過反射)動態屬性的列表中所增加的一類?

注意:一些解決方法是維護手動列表newprop(end+1) = c.addprop(...),但傳遞給另一個基類(直到現在我正在使用反射來獲取有關子類中的屬性的信息)並不太實際。

回答

1

動態特性不是類的性質,但它們」重新僅對象的屬性 - 請注意,如果從dynamicpropsDynamicClass繼承,然後DynamicClass類的不同對象可以有一組不同的屬性:

>> a = DynamicClass; 
>> b = DynamicClass; 
>> a.addprop('hello'); 
>> a 
a = 
    DynamicClass with properties: 

    hello: [] 
>> b 
b = 
    DynamicClass with no properties. 

由於這個原因,你不能通過反射來獲得關於它們的任何信息,這是通過定義獲得關於該類的信息。

您已經給出了一個解決方案(使用properties來檢索對象的所有屬性名稱的列表,動態或不是,然後使用findprop獲取屬性本身,然後獲取有關該屬性的信息)。

這可能是在大多數情況下工作確定,但要注意,properties只返回是屬性的列表都Hidden = falseGetAccess = public(即使你調用properties對象的方法中這是真的)。默認情況下,通過addprop添加的屬性滿足這兩個條件,但可以在添加屬性後更改它們的屬性,並且它們不會顯示在您的解決方案中。如果您在對象上調用fieldnames,也是如此。

另一件可能適用於您的事情是使用isprop直接檢查對象是否有感興趣的屬性。即使該房產是HiddenGetAccess = private,也可以使用。有用地,isprop適用於對象數組,因此您可以創建類DynamicClass的對象數組,然後應用isprop獲取邏輯數組。但我唯一知道如何可靠地獲取所有東西(私有或不是,隱藏或不是,以及是否事先知道屬性名稱)的方法是僅將對象臨時轉儲到結構中,然後獲取字段名,正如@Marek所建議的。

+0

確實有趣的附加筆記。謝謝 ! – CitizenInsane

1
cs = struct(c) 

,如果它僅適用於上市訪問屬性的名稱,這應該是足夠

fieldnames(cs) 
0

我找到了一個解決方法來檢索元數據信息甚至是動態屬性。我使用properties以獲得屬性列表(包括動態的)findprop檢索通過在基類反射信息:

function [] = baseClassRoutine(obj) 

    propNames = properties(obj); 
    propCount = length(propNames); 

    for idx = 1:propCount, 

     propName = propNames{ki}; 
     propMeta = obj.findprop(propName); 

     ... So now can inspect meta about all properties (including dynamic ones) ... 

    end 

end 
+0

這是一個不錯的解決方案。另一個想到:與其使用內置的dynamicprops,你可以重寫subsref和subsasgn來模擬動態屬性。 – siliconwafer