2016-09-08 6 views
0

Ich habe ein Projekt, dass ich etwas Code in andere Schicht legen sollte und aus diesem Grund sollte ich eine Linq-Abfrage zu Methode übertragen. Dieser Code:Wie erhält man eine dynamische Eigenschaft?

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(); 

I umgewandelt up-Code:

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(); 
    } 

aber wenn ich es verwenden in foreach

Eine Ausnahme vom Typ 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' aufgetreten in System.Core.dll, wurde aber nicht in Benutzercode behandelt

Zusätzliche Informationen: 'Objekt' zu tun es keine Definition für ‚Pers_Code‘ enthalten

es wie folgt verwendet:

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

fügen Sie einen Code über, wie Sie es verwenden –

Antwort

0

Ich würde nie dynamisch verwenden das Ergebnis einer Linq-Abfrage zurückzugeben, die anonyme Typen verwendet die Ergebnisse zu projizieren. Stattdessen würde ich eine Klasse erstellen, die die Ergebnisse enthalten:

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

Verbrauch:

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(); 
} 

eine Art erstellen, die Ergebnisse zu halten ist nichts im Vergleich zu der Komplexität der verwendeten dynamisch.

+0

Es ist nicht Arbeit werfen: Kann nicht implizit Typ 'System.Collections.Generic.List << konvertieren anonymen Typ: int Pers_Code, String Tel >>' zu 'System.Collections.Generic .List ' – metro

+0

@metro Sorry. Überprüfen Sie die Bearbeitung. – user3185569

+0

Danke. Es hat funktioniert. – metro

0

Es scheint, dass .NET keine dynamische Typisierung mit var und Iterator durch dynamische durchführen kann, die eine Liste von Objekten darstellt.

Wenn Sie also eine Variable mit var erstellen, kann .NET keinen Rückgabetyp vorhersagen und erstellt eine neue object Variable, da jeder Typ von object geerbt wird.

Die Implementierung eines Rückgabetyps wie dynamic ist jedoch eine schlechte Methode - mögliche Fehler können erst gefunden werden, wenn Sie diese Methode nicht aufrufen. Implementieren Sie daher eine Verwendung einer anderen Klasse, wie von @ user3185569 vorgeschlagen.

Verwandte Themen