代码之家  ›  专栏  ›  技术社区  ›  David

确定反射属性是否可以指定为空

  •  31
  • David  · 技术社区  · 15 年前

    我希望自动发现有关所提供类的一些信息,以便执行类似于表单条目的操作。具体来说,我使用反射为每个属性返回一个propertyinfo值。我可以从我的“表单”中读取或写入每个属性的值,但是如果属性被定义为“int”,我将无法,而且我的程序甚至不应该尝试写入空值。

    如何使用反射来确定给定属性是否可以分配空值,而不需要编写switch语句来检查每种可能的类型?特别是,我想检测像“int”和“int”这样的装箱类型之间的区别。,因为在第二种情况下 希望能够写入空值。isValueType和isByRef似乎没有看到区别。

    public class MyClass
    {
        // Should tell me I cannot assign a null
        public int Age {get; set;} 
        public DateTime BirthDate {get; set;}
        public MyStateEnum State {get; set;}
        public MyCCStruct CreditCard {get; set;}
    
        // Should tell me I can assign a null
        public DateTime? DateOfDeath {get; set;}
        public MyFamilyClass Famly {get; set;}
    }
    

    注意,在实际尝试写入值之前,我需要确定这个信息,因此使用围绕setvalue的异常处理不是一个选项。

    4 回复  |  直到 7 年前
        1
  •  72
  •   Marc Gravell    15 年前

    你需要处理 null 参考文献和 Nullable<T> ,因此(依次):

    bool canBeNull = !type.IsValueType || (Nullable.GetUnderlyingType(type) != null);
    

    注意 IsByRef 是不是有些不同的东西让你可以在 int ref int / out int .

        2
  •  9
  •   Jonas Lincoln    15 年前

    http://msdn.microsoft.com/en-us/library/ms366789.aspx

    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
    

    Type 将是你的 PropertyInfo.PropertyType

        3
  •  4
  •   user215303    15 年前
    PropertyInfo propertyInfo = ...
    bool canAssignNull = 
        !propertyInfo.PropertyType.IsValueType || 
        propertyInfo.PropertyType.IsGenericType &&
            propertyInfo.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>)
    
        4
  •  0
  •   TamusJRoyce    7 年前

    Marc和Jonas都有部分来确定是否可以为泛型类型分配空值。

    // A silly example. default(T) will return null if it is nullable. So no reason to check here. Except for the sake of having an example.
    public U AssignValueOrDefault<U>(object item)
    {
        if (item == null)
        {
            Type type = typeof(U); // Type from Generic Parameter
    
            // Basic Types like int, bool, struct, ... can't be null
            //   Except int?, bool?, Nullable<int>, ...
            bool notNullable = type.IsValueType ||
                               (type.IsGenericType && type.GetGenericTypeDefinition() != typeof(Nullable<>)));
    
            if (notNullable)
                return default(T);
        }
    
        return (U)item;
    }
    

    注意:大多数情况下,您可以检查变量是否为空。然后使用默认值(t)。默认情况下,它将返回空值,因为对象是一个类。