system.reflection无法获取属性值

时间:2014-02-07 02:52:22

标签: c# 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 ....
}

为什么会返回错误消息“Sequence contains no matching element”?

我也试过

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

但它返回“对象引用未设置为对象的实例”。它无法找到ID。

有趣的是,谷歌搜索得不多了......

2 个答案:

答案 0 :(得分:2)

您正在寻找属性,但您拥有的是字段。属性具有get / get访问器,而可以包含自定义代码(但通常不包含),而字段则不包含。您可以将班级更改为:

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 }

答案 1 :(得分:1)

您的代码假定公共属性。是这样的吗?您省略了示例代码中最重要的部分。没有它,我们无法重现您的问题。

无论如何,反思是错误的做法。您应该使用以下语法:

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

其中ICommonPropeties是由所有项目实现的接口。