2016-09-08 4 views
0

У меня есть проект, который должен помещать некоторый код на другом уровне, и из-за этого я должен передать запрос linq к методу. Этот код:Как получить свойство динамического типа?

var HRPersonnelContactInfoTelService = App.Api.HRPersonnelContactInfoTelService.Instance().Data(); 
     var SMSGroupMemberService = App.Api.SMSGroupMemberService.Instance().Data(); 
     return (from x in SMSGroupMemberService 
       where Recivers.Contains(x.GroupID) 
       join v in HRPersonnelContactInfoTelService on x.Pers_Code equals v.Pers_Code 
       select new { Pers_Code = (int)x.Pers_Code, Tel = v.Tel }).ToList(); 

я преобразовал вверх код:

public dynamic HRPersonnelContactInfoTelMethod(List<int> Recivers) 
    { 
     var HRPersonnelContactInfoTelService = App.Api.HRPersonnelContactInfoTelService.Instance().Data(); 
     var SMSGroupMemberService = App.Api.SMSGroupMemberService.Instance().Data(); 
     return (from x in SMSGroupMemberService 
       where Recivers.Contains(x.GroupID) 
       join v in HRPersonnelContactInfoTelService on x.Pers_Code equals v.Pers_Code 
       select new { Pers_Code = (int)x.Pers_Code, Tel = v.Tel }).ToList(); 
    } 

, но когда я использую его в Еогеасп

Исключение из 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' типа произошел в System.Core.dll, но не был обработан в коде пользователя

Дополнительная информация: 'object' do эс не содержит определения для «Pers_Code»

Используйте это так:

var q = App.Api.HRPersonnelContactInfoTelService.Instance().HRPersonnelContactInfoTelMethod(Recivers); 
     foreach (var item in Recivers) 
     { 
      var res = App.Api.SMSMessageGroupService.Instance().AddOrUpdate(null, MessageId, item); 
     } 
     foreach (var z in q) 
     { 
      string SendNumber = Number[1].Trim().Substring(0, 3) == "+98" ? Number[1].Trim() : "+98" + Number[1].Trim(); 
      var res = App.Api.SMSMessageLogService.Instance().AddOrUpdate(null, MessageId, (int)z.Pers_Code, z.Tel.ToString(), 
       0, int.Parse(ddlSMSWorkingGroups.SelectedValue.ToString()), (int)z.Pers_Code, SendNumber, 0); 
      send.SendSMS("nazmaran", "qwerty", SendNumber, "09122596898", txtPredefinedRemarks.Text); 
     } 
+0

Добавить код о том, как вы его используете –

ответ

0

Я никогда не использовал бы динамически возвращать результат запроса Linq, который использует анонимные типы проецировать результаты. Вместо этого я хотел бы создать класс, который содержит результаты:

public class SomeName 
{ 
    public int Pers_Code { set; get; } 
    public string /* Change to Correct Type */ Tel { set; get;} 
} 

Использование:

public List<SomeName> HRPersonnelContactInfoTelMethod(List<int> Recivers) 
{ 
    var HRPersonnelContactInfoTelService = App.Api.HRPersonnelContactInfoTelService.Instance().Data(); 
    var SMSGroupMemberService = App.Api.SMSGroupMemberService.Instance().Data(); 
    return (from x in SMSGroupMemberService 
      where Recivers.Contains(x.GroupID) 
      join v in HRPersonnelContactInfoTelService on x.Pers_Code equals v.Pers_Code 
      select new SomeName() { Pers_Code = (int)x.Pers_Code, Tel = v.Tel }).ToList(); 
} 

Создание типа для хранения результатов ничто по сравнению со сложностью используемых динамичными.

+0

Его не работает бросок: Невозможно неявно преобразовать тип 'System.Collections.Generic.List << анонимный тип: int Pers_Code, строка Tel >>' to 'System.Collections.Generic .List ' – metro

+0

@metro Извините. Проверьте изменение. – user3185569

+0

Спасибо. Это сработало. – metro

0

Кажется, что .NET не может выполнять динамическую типизацию с var и итератором через динамический, представляющий список объектов.

Итак, когда вы создаете переменную с var - .NET не может предсказать тип возврата и создает новую переменную object, так как каждый тип унаследован от object.

Однако реализация возвращаемого типа как dynamic является плохой практикой - возможные ошибки не могут быть найдены до тех пор, пока вы не вызовете этот метод. Итак, реализуйте использование другого класса, как предложил @ user3185569.