[英]How do I check if an anonymous object properties are not empty C#
我有一個WebApi,其中包含一些可以接受XMLDocument值的操作方法。 在這些函數中,我將XML轉換為AnonymousObject
,然后執行了邏輯。
現在,我得到了具有空屬性的XML,並且我需要進行檢查以檢查該匿名對象中的所有屬性(如果它們為null或為空),我在那里做了一些事情,但是沒有用,盡管我通過了XML具有空屬性。
<Students>
<Student ID="" Name="" />
<Student ID="" Name="" />
</Students>
這是我獲得的XML輸入的示例,並且還有其他一些形式,因此,我編寫了一個函數,該函數在將XML反序列化為匿名對象之后檢查屬性是否為空,如下所示:
//This handles the conversion from XML to the anonymous object
XDocument doc;
using (var sr = new StringReader(request.InnerXml))
{
doc = XDocument.Load(sr);
}
var clientList = doc.Descendants()
.Where(d => string.Equals(d.Name.LocalName, "Student", StringComparison.OrdinalIgnoreCase))
.Select(
d =>
new
{
studentId = d.Attributes().SingleOrDefault(a =>
string.Equals(a.Name.LocalName, "ID", StringComparison.OrdinalIgnoreCase))
?.Value,
studentName = d.Attributes().SingleOrDefault(a =>
string.Equals(a.Name.LocalName, "Name", StringComparison.OrdinalIgnoreCase))
?.Value
}).ToList();
然后,我編寫了一個函數,該函數應驗證匿名對象的屬性,所有屬性都應有一個值,但是如果我傳遞了上述XML,它將返回FALSE,就像沒有空值的屬性一樣:
public static bool IsAnyNullOrEmpty(object objectToBeChecked)
{
try
{
foreach (PropertyInfo pi in objectToBeChecked.GetType().GetProperties())
{
if (pi.PropertyType == typeof(string))
{
string value = (string)pi.GetValue(objectToBeChecked);
if (string.IsNullOrEmpty(value))
{
return true;
}
}
}
return false;
//return objectToBeChecked.GetType().GetProperties()
// .Where(pi => pi.GetValue(objectToBeChecked) is string)
// .Select(pi => (string) pi.GetValue(objectToBeChecked))
// .Any(string.IsNullOrEmpty);
}
catch (Exception ex)
{
return true;
}
}
有什么建議嗎?
在調試時,我注意到:
<>f__AnonymousType3`1
Name = "<>f__AnonymousType3`1" FullName = "<>f__AnonymousType3`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"
我強烈建議為此使用命名類而不是匿名類。 顯然,您對xml實例公開的屬性有很深的了解,因此將這些知識隱藏起來是沒有用的。
想象一下,有一天,您不僅不希望使用字符串屬性,還希望使用數字。 然后,您將不得不重新發明您的邏輯的大部分,不僅是驗證,還包括對象的實際工作 。
我想您想做的不僅僅是驗證對象。 您當然想對他們做點什么。 為此,您需要知道他們公開了哪些成員。 在您當前的實現中,它們只是objects
,不會向客戶暴露太多。 因此,要執行任何操作,您需要這樣的事情:
var a = ((theType) myInstance).StudentName;
但是您已經失去了有關theType
實際上是什么的所有信息,因此您可以使用該對象來調用ToString
, Equals
和其他一些從object
派生的成員。
在特殊情況下,您已經知道xml中的實例具有StudentName
和studentId
屬性。 那么,為什么要扔掉它,好像不知道那樣去做呢?
從MSDN開始 :
要將匿名類型或包含匿名類型的集合作為方法的參數傳遞,可以將參數聲明為類型對象。 但是,這樣做會破壞強鍵入的目的。 如果必須存儲查詢結果或將它們傳遞給方法邊界之外,請考慮使用普通的命名結構或類而不是匿名類型。
我這樣解決了:
public static bool IsAnyNullOrEmpty(object objectToBeChecked, params string[] parametersToBeChecked)
{
foreach (var obj in (IEnumerable)objectToBeChecked)
{
foreach (var pi in obj.GetType().GetProperties())
{
if (parametersToBeChecked.Contains(pi.Name))
{
var value = (string)pi.GetValue(obj);
if (string.IsNullOrEmpty(value))
{
return true;
}
}
}
}
return false;
}
這將使用您要檢查的對象(匿名對象)和屬性名稱,這對我有用。
如果要通過某種方法傳遞對象,則需要使用具體的類實現。 復制您的xml結構,並讓Visual Studio為您創建反序列化類。 編輯->選擇性粘貼->將Xml粘貼為類
如果知道您的Xml-Structur,為什么要丟失該信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.