Невозможно привести объект анонимного общего списка - PullRequest
0 голосов
/ 26 января 2019

Если у вас есть идеи, как мне перечислить список объектов, пожалуйста, дайте мне знать. Вот как это создано. По какой-то причине мне не удалось преобразовать его в List, IList, Enumerable, IEnumerable. Я предполагаю, что это из-за того, как это было создано (третьей стороной). Просто посмотреть, есть ли у кого-нибудь идеи.

Ошибка выглядит следующим образом:

Unable to cast object of type '<>f__AnonymousType5`1[System.Collections.Generic.List`1[SugarRest.Model.AMP_Product_Line]]' to type 'System.Collections.Generic.List`1[SugarRest.Model.AMP_Product_Line]'.

Объект создан следующим образом:

private static AMP_Contract CreateCrmContract(ContractDetailViewModel model, int bookmanContractNumber, int renewedFromContractNumber)
        {
            List<AMP_Product_Line> productLines = CreateProductLinesPrint(model, bookmanContractNumber);

            //Contract
            AMP_Contract ampContract = new AMP_Contract();

            ...

            ampContract.amp_amp_contracts_amp_amp_product_lines = new { productLines };

            return ampContract;
        }

public class AMP_Contract
    {              
        ...
        public object amp_amp_contracts_amp_amp_product_lines { get; set; }
        ...
    }

Объект, к которому я пытаюсь получить доступ / перечислить, выглядит следующим образом:

vc

enter image description here

Я также пытался это сделать, однако рассматриваемый объект не перечислим, поскольку он является объектом.

enter image description here

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Прежде всего: тот, кто написал этот код, активно пытается помешать вам получить доступ к этой коллекции.Вы должны очень серьезно задуматься о том, правильно ли пытаться победить их попытку;они, вероятно, скрывают это по какой-то причине.

Самый простой способ сделать это - использовать динамический для считывания значения из анонимного типа.Затем вы можете выполнить динамическое преобразование в нужный вам тип последовательности:

var contract = CreateCrmContract(...whatever...);
dynamic d = contract.amp_amp_contracts_amp_amp_product_lines;
IEnumerable<AMP_Product_Line> lines = d.productLines;

И теперь мы вернулись в статически типизированный мир:

foreach (AMP_Product_Line line in lines)
  Console.WriteLine(line);
0 голосов
/ 26 января 2019

Вы должны написать метод для этого

public static object ToNonAnonymousList<T>(this List<T> list, Type t)
{

   //define system Type representing List of objects of T type:
   var genericType = typeof(List<>).MakeGenericType(t);

   //create an object instance of defined type:
   var l = Activator.CreateInstance(genericType);

   //get method Add from from the list:
   MethodInfo addMethod = l.GetType().GetMethod("Add");

   //loop through the calling list:
   foreach (T item in list)
   {

      //convert each object of the list into T object 
      //by calling extension ToType<T>()
      //Add this object to newly created list:
      addMethod.Invoke(l, new object[] { item.ToType(t) });
   }

   //return List of T objects:
   return l;
}

использования

var genericType = typeof(List<>).MakeGenericType(t);

обзора, например

https://www.codeproject.com/Articles/38635/Converting-anonymous-types-to-any-type

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...