Поиск индекса элемента в списке <FieldInfo>, где FieldInfo представляет список <T> - PullRequest
0 голосов
/ 12 января 2020

У меня есть собственный класс списков List<T>, из которого я позже создаю несколько списков объектов List<TypeA> MyList1, MyList2,..., List<TypeB> MyList3,..., которые не создаются во время компиляции. Во время выполнения я использую отражение, чтобы создать экземпляры этих списков, получить их имя и сохранить его в свойстве (почему, сейчас это не имеет значения, и я показываю только соответствующий код):

List<FieldInfo> ListOfFields = new List<FieldInfo>();

foreach (FieldInfo field in this.GetType().GetFields())
{
   ListOfFields.Add(field); // saves all my List<T> in the ListOfFields list
}

Эта процедура является обязательным из-за нескольких программных ограничений. Отражая с помощью поля FieldInfo, я могу получить это поле определенного типа List<T>, но мне нужно перебрать их элементы, чтобы проверить, принадлежит ли данный <T> obj (неизвестный) тому или иному списку. Каждый field из foreach l oop будет одного и того же типа List<T>.
Я пытаюсь найти способ пропустить <T> obj> и l oop через каждый field (List<T>) пока не найду совпадение obj == field[i], что-то вроде, например:

public Tuple<string, string> GetElementTupleFor<T>(T obj)
{
    foreach(FieldInfo field in ListOfFields)
    {
       var elements = field.MyRequestForA_GetElements_Method(); // does such method exist?
       for(int i=0; i<elements.Count; i++)
       {
          if (obj == elements[i])
          {
             return new Tuple<string, string>(field.Name, ""+i);
          }
       }
    }
    return new Tuple<string, string>("NotFound", "?");
 }

Заранее спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 12 января 2020

Если поле не указано c, вам нужно будет указать объект, с которого будет считываться поле. Таким образом, вашему методу GetElementTupleFor необходим еще один параметр:

public Tuple<string, string> GetElementTupleFor<T>(object objToQuery, T obj)
{
    foreach(FieldInfo field in ListOfFields)
    {
       var elements = field.GetValue(objToQuery) as List<T>;
       if (elements != null)
       {
          for(int i=0; i<elements.Count; i++)
          {
             if (obj == elements[i])
             {
                return new Tuple<string, string>(field.Name, ""+i);
             }
          }
       }
    }
    return new Tuple<string, string>("NotFound", "?");
 }
0 голосов
/ 12 января 2020

Удастся ли списку удалить объекты или изменить порядок?

Если нет, то почему бы не изменить объект List<FieldInfo> на список вашего собственного класса-оболочки, который принимает * 1004? * и index значения при добавлении элемента в список. Ваш метод добавления становится:

List<MyWrapper> ListOfFields = new List<MyWrapper>();

foreach (FieldInfo field in this.GetType().GetFields())
{
   var myItem = new MyWrapper(field, ListOfFields.Count);
   ListOfFields.Add(myItem);
}

class MyWrapper
{
    public FieldInfo Field { get; private set; }
    public int Index { get; private set; }

    public MyWrapper(FieldInfo field, int index)
    {
        Field = field;
        Index = index;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...