编程语言
首页 > 编程语言> > c#-根据ID从列表中获取元素

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