2008-12-03 10 views
5

Próbuję wysłać anonimowy obiekt za pośrednictwem usługi sieciowej. Czy mimo to mogę to zrobić bez ręcznego tworzenia klasy i przesyłania jej do tej klasy? Obecnie nie można serializować wyrzucania wyjątku mówiącego o obiekcie Anonymous.Jak serializować anonimowy obiekt do wysyłania przez usługę sieciową SOAP?

// Some code has been removed here to simplify the example. 
[WebMethod(EnableSession = true)] 
public Response GetPatientList() { 
    var patientList = from patient in ((User)Session["user"]).Practice.Patients 
         select new { 
          patientID = patient.PatientID, 
          status = patient.Active ? "Active" : "Inactive", 
          patientIdentifier = patient.PatientIdentifier, 
          physician = (patient.Physician.FirstName + " " + patient.Physician.LastName).Trim(), 
          lastModified = patient.Visits.Max(v => v.VisitDate) 
         }; 
    return patientList; 
} 

Z góry dziękuję.

Edit: Oto przykład tego, co mam na myśli ręcznie tworząc klasę wrócić i wypełnić go z anonimowego obiektu ...

typ
public class Result { 
    public bool success; 
    public bool loggedIn; 
    public string message; 
} 

public class PracticeInfoResult : Result { 
    public string practiceName; 
    public string address; 
    public string city; 
    public string state; 
    public string zipCode; 
    public string phone; 
    public string fax; 
} 

Odpowiedz

7

Anonymous mają być wykorzystane do prostych projekcji bardzo luźno powiązanych danych, wykorzystywanych wyłącznie w ramach metody. Jeśli ma sens, aby metoda sieciowa zwróciła dane typu, to naprawdę powinna być przyzwoicie hermetyzowana. Innymi słowy, nawet jeśli masz , możesz znaleźć sposób na zwrócenie instancji anonimowego typu z metody internetowej, zdecydowanie sugeruję, żebyś tego nie robił.

Ja osobiście nie utworzę klas z polami publicznymi - używaj automatycznie zaimplementowanych właściwości, więc możesz bezpiecznie dodać więcej zachowań później, jeśli zajdzie taka potrzeba.

Należy pamiętać, że po utworzeniu "właściwego" typu, wyrażenie zapytania musi się zmienić bardzo, bardzo nieznacznie - wystarczy dodać nazwę typu między new i {, aby użyć inicjalizatora obiektu.

+0

Po prostu ciekawi, dlaczego wolisz automatycznie wdrażane właściwości nad polami publicznych? – Kevin

+0

Zobacz http://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx –

+0

Jeśli zwracasz serializowaną wiadomość, taką jak json, czy nie oznacza to, że zgadzasz się ze stwierdzeniem, że jest luźno powiązana? to nadal wydaje się być ważnym przypadkiem użycia. – pc1oad1etter

1

Oto kod, którego użyłem.

[WebMethod(EnableSession = true)] 
public PatientsResult GetPatientList(bool returnInactivePatients) { 
    if (!IsLoggedIn()) { 
     return new PatientsResult() { 
      Success = false, 
      LoggedIn = false, 
      Message = "Not logged in" 
     }; 
    } 
    Func<IEnumerable<PatientResult>, IEnumerable<PatientResult>> filterActive = 
     patientList => returnInactivePatients ? patientList : patientList.Where(p => p.Status == "Active"); 
    User u = (User)Session["user"]; 
    return new PatientsResult() { 
     Success = true, 
     LoggedIn = true, 
     Message = "", 
     Patients = filterActive((from p in u.Practice.Patients 
         select new PatientResult() { 
          PhysicianID = p.PhysicianID, 
          Status = p.Active ? "Active" : "Inactive", 
          PatientIdentifier = p.PatientIdentifier, 
          PatientID = p.PatientID, 
          LastVisit = p.Visits.Count > 0 ? p.Visits.Max(v => v.VisitDate).ToShortDateString() : "", 
          Physician = (p.Physician == null ? "" : p.Physician.FirstName + " " + p.Physician == null ? "" : p.Physician.LastName).Trim(), 
         })).ToList<PatientResult>() 
    }; 
} 
public class Result { 
    public bool Success { get; set; } 
    public bool LoggedIn { get; set; } 
    public string Message { get; set; } 
} 
public class PatientsResult : Result { 
    public List<PatientResult> Patients { get; set; } 
} 
public class PatientResult { 
    public int PatientID { get; set; } 
    public string Status { get; set; } 
    public string PatientIdentifier { get; set; } 
    public string Physician { get; set; } 
    public int? PhysicianID {get;set;} 
    public string LastVisit { get; set; } 
} 

}

Powiązane problemy