C# Reflection: How to get the type of a Nullable?

后端 未结 5 1320
面向向阳花
面向向阳花 2021-01-01 11:04

What I want to do is something like this:

switch( myObject.GetType().GetProperty( \"id\") )
{
    case ??: 
        // when Nullable, do this
           


        
相关标签:
5条回答
  • 2021-01-01 11:09

    I've been using the following type of code to check if the type is nullable and to get the actual type:

    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
    {
        return Nullable.GetUnderlyingType(type);
    }
    

    If the type is e.g. Nullable this code returns the int part (underlying type). If you just need to convert object into specific type you could use System.Convert.ChangeType method.

    0 讨论(0)
  • 2021-01-01 11:21

    Update: Looks like C# 7 will support switching on Types as the asker of this question was trying to do. It's a little different though so watch out for syntax landmines.

    You don't need a string name to compare it:

    if (myObject.GetType().GetProperty("id").PropertyType == typeof(Nullable<Int32>))
        // when Nullable<Int32>, do this
    else if (myObject.GetType().GetProperty("id").PropertyType == typeof(string))
        // when string, do this
    else if (myObject.GetType().GetProperty("id").PropertyType == typeof(Nullable<bool>))
        // when Nullable<bool>, do this
    
    0 讨论(0)
  • 2021-01-01 11:24

    The question is very confusing. Is "myObject" the object that might be a nullable int? Or is the property "id" possibly of type nullable int?

    If the former, your question cannot be answered because it presupposes a falsehood. There is no such thing as a boxed nullable int. I note that all of the answers which propose if (myobject.GetType() == typeof(int?)) are therefore incorrect; the condition will never be true.

    When you convert a nullable int to object, either it becomes a null reference (if the nullable int had no value) or it becomes a boxed int. There is no way to determine if an object contains a nullable int because an object never contains a nullable int.

    If the latter, compare the property type to typeof(int?). You cannot use a switch; only constants may be used for switch cases and types are not constants.

    All that said, this is a bad code smell. Why are you using reflection in the first place?

    0 讨论(0)
  • 2021-01-01 11:25

    As @Cody Gray said if statements would probably be the best way

    var t = myObject.GetType();
    
    if (t == typeof(Nullable<int>))
    { }
    else if (t == typeof(string))
    {}
    else if (t==typeof(Nullable<bool>))
    {}
    
    0 讨论(0)
  • 2021-01-01 11:26

    In .net, instances of value types are just collections of bits, with no associated type information. For every value type other than Nullable<T>, however, the system also auto-generates a corresponding class type which derives from System.ValueType. A widening conversion exists from the value type to the auto-generated class type, and a narrowing conversion from the auto-generated class type to the value type. In the case of Nullable<T>, there is no corresponding auto-generated class type with conversions to/from the value type; instead, widening conversions exist in both directions between Nullable<T> and the class type associated with T.

    As far as I can tell, this weird behavior was implemented to allow comparisons between null and an empty Nullable<T> to return true.

    0 讨论(0)
提交回复
热议问题