2010-06-27 74 views
1

進一步my previous question,我現在有一個新的問題,我希望得到一個屬性,它是一個數組:如何使用反射訪問數組項屬性?

string propertyName="DisplayLayout.Bands[0].Columns"; 
PropertyInfo pi = control.GetType().GetProperty(propertyName) 

但實際上,它返回null。

最好的問候,

弗洛裏安 編輯:對不起,缺乏精確度:$ I訪問樂隊財產感謝我precent問題的答案。我真正的問題是訪問屬於'Band'類型屬性的'Columns'屬性。我希望它更清楚。

EDIT2:這裏一個例子:

PropertyInfo t = control.GetType().GetProperty(entry.Value[i].Nom.Split(new char[] { '.' })[0]); 
PropertyInfo property = control.GetType().GetProperty(entry.Value[i].Nom.Split(new char[] { '.' })[0]); 
PropertyInfo nestedProperty = property.PropertyType.GetProperty("Bands"); 

在nestedProperty我有帶(Infragistics.UltraWinGrid.BandsCollection樂隊),但我不管理訪問帶[0]和 '列' 財產

回答

1

語法Bands[0]是一個indexer訪問。索引器是一個具有參數的屬性。 C#不允許通過名稱訪問具有參數的屬性,但允許索引器語法與匹配類型爲DefaultMemberAttribute中給出的名稱的屬性匹配。要獲得PropertyInfo在你的例子索引,你可以寫:

PropertyInfo nestedProperty = property.PropertyType.GetProperty("Bands"); 
var defaultMember = (DefaultMemberAttribute)Attribute.GetCustomAttribute(nestedProperty.PropertyType, typeof(DefaultMemberAttribute)); 
var nestedIndexer = nestedProperty.PropertyType.GetProperty(defaultMember.MemberName); 

爲了得到索引值,你將需要第二個參數與值提供給PropertyInfo.GetValue在經過:

var value = nestedIndexer.GetValue(bands, new object[] { 0 }); 
+0

謝謝。然而,行nestedProperty.PropertyType.GetProperty(defaultMember.MemberName); 返回'null'。在'quickwatch'編輯器中,'value'列表示'nestedProperty.PropertyType.GetProperty(defaultMember.MemberName)'拋出了一個'System.Reflection.AmbiguousMatchException'類型的異常。System.Reflection.PropertyInfo {System.Reflection.AmbiguousMatchException} ' – Florian 2010-06-27 20:40:36

+0

@Florian:使用GetProperty的重載,它接受重載解析的參數類型列表:nestedProperty.PropertyType.GetProperty(defaultMember.MemberName,new Type [] {typeof(int)}) – Quartermeister 2010-06-27 21:20:32

+0

它工作得很好。謝謝 !!!只是最後一個問題。在你的例子中,在最後一行: var value = nestedIndexer.GetValue(bands,new object [] {0}); 什麼是參考帶? – Florian 2010-06-28 08:36:53

3

當您引用某個實例的類型時,您只會對所述類型的方法,屬性等進行「反射」訪問。

因此,不支持點符號,因爲您基本上觸摸3種類型,某些控件,某些樂隊和樂隊實例的集合。

換句話說,您可以針對屬性「Columns」詢問控件屬性「Bands」或「Band」的類型,但不要使用點標記。

2

你走得太快了。這裏有三種類型和三種屬性,您需要三次使用GetType和GetProperty。