2008-12-03 89 views
5

我想通過Web服務發送一個匿名對象。無論如何,我可以做到這一點,而無需手動創建一個類並將其轉換爲該類?目前它拋出一個異常說匿名對象不能序列化。如何序列化通過SOAP Web服務發送的匿名對象?

// 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; 
} 

在此先感謝。

編輯:這裏是我的意思是通過手動創建一個類來返回,並與匿名對象填充一個例子...

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

回答

7

匿名類型是爲了用於簡單的預測非常鬆散耦合的數據,僅在方法中使用。如果Web方法返回某種類型的數據是有意義的,那麼它確實應該體面封裝。換句話說,即使你可以通過找到一種方法來從Web方法返回一個匿名類型的實例,我強烈建議你不要這樣做。

我個人不會使用公共字段創建類 - 使用自動實現的屬性來代替,所以如果需要,可以安全地添加更多行爲。

請注意,創建「正確」類型後,查詢表達式只需要非常輕微地更改 - 只需在new{之間添加類型名稱即可使用對象初始值設定項。

+0

只是好奇,爲什麼你喜歡自動在公共領域實現的屬性? – Kevin 2008-12-03 15:19:17

1

這是我使用的代碼。

[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; } 
} 

}

相關問題