2014-02-07 71 views
0

我有以下幾點:的System.Reflection無法獲得屬性值

List<Agenda> Timetable; 

public class Agenda 
{ 
    public Object item; //item can be of any object type but has common properties 
} 

class MasterItem 
{ 
    public long ID; 
} 

class item1:MasterItem { //properties and methods here } 

class item2:MasterItem { //properties and methods here } 

在代碼的開始,我有我添加使用

item1 sItem = new item1() { //Initialize properties with values } 
Timetable.Add(new Agenda {item = sItem); 

在這裏我要項的列表獲得ID爲12的項目的議程。我試過使用

object x = Timetable.Find(delegate (Agenda a) 
{ 
    System.Reflection.PropertyInfo pinfo = a.item.GetType().GetProperties().Single(pi => pi.Name == "ID"); //returned Sequence contains no matching element 
    return .... 
} 

它爲什麼會返回錯誤消息「序列包含沒有匹配的元素」?

我也試過

a.item.GetType().GetProperty("ID") 

但它返回「未設置爲一個對象的實例對象引用」。它找不到該ID。

有趣的是,不要從谷歌搜索得到很多...

回答

2

您正在尋找一個物業,但你有什麼是字段。一個屬性具有獲取/獲取訪問者的權限,而可以包含包含自定義代碼(但通常不包含),而字段不包含。您可以把班級改爲:

public class Agenda 
{ 
    public Object item {get; set;} //item can be of any object type but has common properties 
} 

class MasterItem 
{ 
    public long ID {get; set;} 
} 

但是,你的狀態

項目可以是任何對象類型,但具有共同的屬性

如果是這樣的話,那麼你應該定義它們都實現的接口。這樣,你不需要反思:

public class Agenda 
{ 
    public ItemWithID item {get; set;} 
} 


Interface ItemWithID 
{ 
    long ID {get; set;} 
} 

class MasterItem : ItemWithID 
{ 
    public long ID {get; set;} 
} 

class item1:MasterItem { //properties and methods here } 

class item2:MasterItem { //properties and methods here } 
+0

這有助於很多。謝謝! – cSharpDev

1

您的代碼假定公共屬性。是這樣嗎?您省略了示例代碼中最重要的部分。沒有它,我們不能重現您的問題。

無論如何,反射在這裏是錯誤的方法。您應該使用以下語法:

Timetable.Find(delegate(ICommonPropeeties a) { return a.ID == 12; }); 

其中ICommonPropeties是由所有項目實現的接口。

+0

是的,我錯過了!謝謝!它現在的魅力... – cSharpDev