是否有一种通用的方法来递归检查反序列化对象的空字段?

问题描述 投票:0回答:1

我收到许多不同的消息,我将它们反序列化为非常不同的对象

这些对象中的大多数都有不可为空的字段,但在所有消息类型中(从 GraphQL、Azure 服务和存储总线,到 CosmosSB 以及我可能忘记的更多)它们中的一些很乐意反序列化为空对象无论如何领域。

因此,我非常可以使用一个可以让我做的组件

T objectFromMessage = GetObject(message);
FieldAsserter.AssertAllFieldsSet<T>(objectFromMessage); //Throws if any non-nullable fields are null

你知道是否已经存在任何这样的字段验证方法,默认情况下或 Nuget 中的某个地方?或者,如果我必须自己写,你能给我任何线索吗?从哪里开始寻找?

你尝试了什么,你期待什么?

在这一点上真的没什么——粗略搜索 NuGet 和一些关于反射的想法是我在思考“也许 SO 有答案”之前得到的。

关于 SO 已经有几个类似的问题,但它们似乎适用于单个对象——答案的类型是“为你的类编写一个扩展方法”,但我想要一个适用于任何东西——我的消息类型太多了。

c# reflection nullreferenceexception
1个回答
1
投票

你在寻找像下面这样简单的东西吗?您还可以添加自定义或默认属性以指示在此检查中忽略属性。

public static bool AreAllPropertiesNotNull<T>(this T obj)  where T : class
{

    PropertyInfo[] properties = typeof(T).GetProperties();

    foreach (PropertyInfo property in properties)
    {
        if (property.GetCustomAttribute<IgnoreAttribute>() != null)
        {
            continue; // Skip properties with Ignore attribute
        }

        dynamic propertyValue = property.GetValue(obj);

        if (propertyValue == null)
        {
            return false;
        }
    }

    return true;
}

使用扩展方法。

 T objectFromMessage = GetObject(message);
 Assert.True(objectFromMessage.AreAllPropertiesNotNull());
© www.soinside.com 2019 - 2024. All rights reserved.