簡體   English   中英

如何檢查匿名對象屬性是否為空C#

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

有什么建議嗎?

編輯#1

在調試時,我注意到:

  • 屬性名稱: <>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實際上是什么的所有信息,因此您可以使用該對象來調用ToStringEquals和其他一些從object派生的成員。

在特殊情況下,您已經知道xml中的實例具有StudentNamestudentId屬性。 那么,為什么要扔掉它,好像不知道那樣去做呢?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM