使用反射获取对象的所有属性-但仅获取对象为其具有值的属性(不是默认值或null)

气息

因此,我想返回对象的属性,例如通用或硬编码的typeof(User),例如

但是,我只想返回我要为其获取属性的对象的属性,并为其设置了一个值,而不是默认值或null。这样做的原因是,我只能使用这些属性来构建表达式,以仅针对数据库中项目的列检查这些属性。

我尝试过类似的方法,但是它仍然可以带回所有价值,

public User AutomatedUser {get;set;} // some properties of this will populated elsewhere

var props = typeof(User).GetProperties()
            .Where(pi => pi.GetValue(AutomatedFromUser) != pi.PropertyType.GetDefault());

然后,我在论坛上找到了用于获取类型默认值的方法,因为编译器不允许!= default(pi.PropertyType),因为“ Pi”是变量。方法如下...

public static object GetDefault(this Type type)
    {
        // If no Type was supplied, if the Type was a reference type, or if the Type was a System.Void, return null
        if (type == null || !type.IsValueType || type == typeof(void))
            return null;

        // If the supplied Type has generic parameters, its default value cannot be determined
        if (type.ContainsGenericParameters)
            throw new ArgumentException(
                "{" + MethodInfo.GetCurrentMethod() + "} Error:\n\nThe supplied value type <" + type +
                "> contains generic parameters, so the default value cannot be retrieved");

        // If the Type is a primitive type, or if it is another publicly-visible value type (i.e. struct), return a 
        //  default instance of the value type
        if (type.IsPrimitive || !type.IsNotPublic)
        {
            try
            {
                return Activator.CreateInstance(type);
            }
            catch (Exception e)
            {
                throw new ArgumentException(
                    "{" + MethodInfo.GetCurrentMethod() + "} Error:\n\nThe Activator.CreateInstance method could not " +
                    "create a default instance of the supplied value type <" + type +
                    "> (Inner Exception message: \"" + e.Message + "\")", e);
            }
        }

        // Fail with exception
        throw new ArgumentException("{" + MethodInfo.GetCurrentMethod() + "} Error:\n\nThe supplied value type <" + type +
                                    "> is not a publicly-visible type, so the default value cannot be retrieved");
    }
}

任何提示或帮助,将不胜感激,为什么这将无法正常工作,或我要去哪里错了。

粉红色的

您遇到的问题与装箱和==执行引用相等的事实有关两者PropertyInfo.GetValue和您的GetDefault函数都返回object,因此您的值类型将被装箱。这意味着即使两个值均为零,也将它们放入两个单独的框中。这些框中的每个框都不相同object,因此引用相等返回false

考虑以下:

object x = 0;
object y = 0;
Console.WriteLine(x == y); // prints False

解决方案是改为调用object.Equals(实例或静态版本)。

object x = 0;
object y = 0;
Console.WriteLine(x.Equals(y)); // prints True 
Console.WriteLine(object.Equals(x, y)); // prints True

有关这两个版本的示例,请参见此SharpLab演示。

这意味着您的问题的解决方案如下:

var props = typeof(User).GetProperties()
            .Where(pi => 
                !object.Equals(
                    pi.GetValue(AutomatedFromUser),
                    pi.PropertyType.GetDefault()
                ) 
             );

null因为null.Equals(...)显然会抛出异常,所以我们使用静态版本来防范调用静态方法与实例方法相同不同之处在于它首先检查引用是否相等,然后防止出现空值。之后它调用x.Equals(y)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

获取所有属性java对象

来自分类Dev

如何在Scala中使用反射获取所有对象值和子对象值?

来自分类Dev

获取对象的所有属性的列表

来自分类Dev

通用解决方案,以获取对象范围内所有属性的默认值

来自分类Dev

如何使用反射从动态(匿名类型)对象获取属性?

来自分类Dev

在猫鼬中,我为对象属性传递什么值以从架构中获取默认值?

来自分类Dev

通过反射获取所有ICollection属性

来自分类Dev

具有默认值的聚合物对象属性

来自分类Dev

如何使用反射和递归获取任何对象的所有名称和值

来自分类Dev

获取具有特定属性相同值的对象的列表

来自分类Dev

如何在C#中使用反射获取方法的所有属性和属性数据

来自分类Dev

具有默认值的Javascript对象

来自分类Dev

获取装配中的所有属性类型(反射)

来自分类Dev

如何获取对象的所有属性并将其插入其自己的对象数组属性?

来自分类Dev

具有其自身默认值的对象解构分配

来自分类Dev

使用Commons Digester解析为具有默认值的属性

来自分类Dev

使用通用类型对象的反射获取属性

来自分类Dev

如何在Scala中使用反射获取所有对象值和子对象值?

来自分类Dev

获取对象的所有属性的列表

来自分类Dev

如何使用反射从动态(匿名类型)对象获取属性?

来自分类Dev

如何使用反射和递归获取任何对象的所有名称和值

来自分类Dev

值对象属性应配置为默认值吗?

来自分类Dev

使用反射将类中的所有静态属性作为对象获取VB.NET

来自分类Dev

为获取对象属性标识符而不是属性值?

来自分类Dev

具有默认值的Javascript对象

来自分类Dev

使用反射获取 T obj 中的所有 DateTime 和 Nullable<DateTime> 属性

来自分类Dev

使用反射获取属性

来自分类Dev

具有默认值和默认属性的对象参数接口

来自分类Dev

从具有特定属性值的对象中获取值

Related 相关文章

  1. 1

    获取所有属性java对象

  2. 2

    如何在Scala中使用反射获取所有对象值和子对象值?

  3. 3

    获取对象的所有属性的列表

  4. 4

    通用解决方案,以获取对象范围内所有属性的默认值

  5. 5

    如何使用反射从动态(匿名类型)对象获取属性?

  6. 6

    在猫鼬中,我为对象属性传递什么值以从架构中获取默认值?

  7. 7

    通过反射获取所有ICollection属性

  8. 8

    具有默认值的聚合物对象属性

  9. 9

    如何使用反射和递归获取任何对象的所有名称和值

  10. 10

    获取具有特定属性相同值的对象的列表

  11. 11

    如何在C#中使用反射获取方法的所有属性和属性数据

  12. 12

    具有默认值的Javascript对象

  13. 13

    获取装配中的所有属性类型(反射)

  14. 14

    如何获取对象的所有属性并将其插入其自己的对象数组属性?

  15. 15

    具有其自身默认值的对象解构分配

  16. 16

    使用Commons Digester解析为具有默认值的属性

  17. 17

    使用通用类型对象的反射获取属性

  18. 18

    如何在Scala中使用反射获取所有对象值和子对象值?

  19. 19

    获取对象的所有属性的列表

  20. 20

    如何使用反射从动态(匿名类型)对象获取属性?

  21. 21

    如何使用反射和递归获取任何对象的所有名称和值

  22. 22

    值对象属性应配置为默认值吗?

  23. 23

    使用反射将类中的所有静态属性作为对象获取VB.NET

  24. 24

    为获取对象属性标识符而不是属性值?

  25. 25

    具有默认值的Javascript对象

  26. 26

    使用反射获取 T obj 中的所有 DateTime 和 Nullable<DateTime> 属性

  27. 27

    使用反射获取属性

  28. 28

    具有默认值和默认属性的对象参数接口

  29. 29

    从具有特定属性值的对象中获取值

热门标签

归档