2013-01-24 71 views
2

我基本上試圖實現一些ASP.Net控件(例如DropDownList)使用的邏輯的一部分,以接受迭代的通用數據源通過調用由用戶指定的屬性消耗每行。.NET:從數組中的對象的動態屬性檢索值

這是在VB.Net。舉例如下:

Dim myObject As Object = getUnknownObject() 
Dim propertyName As String = getUnknownPropertyNameForObject() 

'Now given that myObject is an array of objects which possess the property given by propertyName ' 

For Each i As Object In myObject 
    Dim valueOfProperty As String = invokePropertyOfObject(myObject, propertyName) 
    'Do something with value' 
Next i 

我正在尋找的invokePropertyOfObject的實現將返回他屬性的值。我想留意動態屬性在循環中調用的事實,因此可能會有與以這種方式使用反射相關的性能問題。

有沒有人知道我正在做什麼的理想方式?如果可能的話,我想要一種方法只執行一次動態屬性查找,並在循環中重複使用它。是否可以這樣做,同時要記住,雖然對象未知,但數組中的每個對象都是相同的類型。

+0

爲了獲得你需要一個實例的屬性值,所以你將不得不爲每個對象調用它。你可以做到這一點,但它非常脆弱。如果物體是你的,用合適的屬性去除它們,然後通過它找到它們將是更好的方法。 –

回答

1

您可以在循環之前的數組類型獲取PropertyInfo對象,然後你可以在陣列中使用propertyInfo.GetValue()方法爲每個元素。這樣你只能找到一次財產,但能夠獲得每個記錄的價值。

+0

剛試過使用CallByName和通過PropertyInfo對象調用。在循環1,000,000個KeyValuePair的數據集時,PropertyInfo的速度快了10倍 – Trent

1

實際上,如果沒有其他選擇,您可以直接使用myObject.Property()。最好將對象轉換爲正確的類型以便使用該屬性。

這是你的其他選擇:

Dim value as String = CallByName(myObject, propertyName, CallType.Get) 
+0

對於數組中的每個對象,CallByName將被調用一次。這樣做是否有很大的開銷?鑑於數組中可能有許多對象,在每個對象上調用相同屬性的有效方法是什麼? – Trent

+0

http://stackoverflow.com/questions/1267588/disadvantages-of-callbyname-function-in-vb-net – SysDragon