我有以下内容:
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。
有趣的是,谷歌搜索得不多了......
答案 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是由所有项目实现的接口。