c#-根据ID从列表中获取元素
作者:互联网
该问题与这个问题有关:Given System.Type T, Deserialize List<T>
给定此功能以检索所有元素的列表…
public static List<T> GetAllItems<T>()
{
XmlSerializer deSerializer = new XmlSerializer(typeof(List<T>));
TextReader tr = new StreamReader(GetPathBasedOnType(typeof(T)));
List<T> items = (List<T>)deSerializer.Deserialize(tr);
tr.Close();
}
…我想创建一个函数来仅检索具有所需UID(唯一ID)的那些项中的一项:
public static System.Object GetItemByID(System.Type T, int UID)
{
IList mainList = GetAllItems<typeof(T)>();
System.Object item = null;
if (T == typeof(Article))
item = ((List<Article>)mainList).Find(
delegate(Article vr) { return vr.UID == UID; });
else if (T == typeof(User))
item = ((List<User>)mainList).Find(
delegate(User ur) { return ur.UID == UID; });
return item;
}
但是,由于GetAllItems< typeof(T)>();,这不起作用.呼叫格式不正确.
问题1a:考虑到所有将调用GetItemByID()的类都具有UID作为元素,我该如何修复第二个函数以正确返回唯一元素?我希望能够进行公共静态< T>如果可能的话,GetItemByID< T>(int UID).
问题1b:同样的问题,但是假设我不能修改GetItemByID的函数原型?
解决方法:
1a.确保所有T实现了定义属性UID的接口IUniqueIdentity,然后将泛型方法约束为仅接受IUniqueIdentity类型.所以:
public static T GetItemById<T>(int UID) where T:IUniqueIdentity
{
IList<T> mainList = GetAllItems<T>();
//assuming there is 1 or 0 occurrences, otherwise FirstOrDefault
return mainList.SingleOrDefault(item=>item.UID==UID);
}
public interface IUniqueIdentity
{
int UID{get;}
}
标签:xml-deserialization,generic-list,xml-serialization,asp-net,c 来源: https://codeday.me/bug/20191209/2095646.html