Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带反射的.NET动态对象_.net_Reflection_Enums_Nullable - Fatal编程技术网

带反射的.NET动态对象

带反射的.NET动态对象,.net,reflection,enums,nullable,.net,Reflection,Enums,Nullable,我如何通过反射确定可为null的(枚举)是否确实是枚举 我正在使用一种方法,该方法使用从数据库调用检索的IDataReader动态填充T类型的对象。本质上,它循环遍历datareader的序号,以及T的所有属性,并填充与序号名称匹配的属性(也会抛出一些属性魔法来更改列名)。在其他任何情况下,它都非常有效,但是当我检查System.Enum属性的BaseType时,我发现,System.ValueType因此,枚举检查失败,方法爆炸 [编辑: Type.IsEnum无法满足我的需要。这里的主要问题

我如何通过反射确定
可为null的(枚举)
是否确实是
枚举

我正在使用一种方法,该方法使用从数据库调用检索的
IDataReader
动态填充
T
类型的对象。本质上,它循环遍历datareader的序号,以及
T
的所有属性,并填充与序号名称匹配的属性(也会抛出一些属性魔法来更改列名)。在其他任何情况下,它都非常有效,但是当我检查
System.Enum
属性的
BaseType
时,我发现,
System.ValueType
因此,枚举检查失败,方法爆炸

[编辑:
Type.IsEnum
无法满足我的需要。这里的主要问题是,
t
的基类型层次结构中没有任何内容表明它是一个
Enum
。这就好像将其设为
null
类型会丧失我的
Enum
权利一样。]

有什么想法吗?

有点麻烦:

  • PropertyInfo.PropertyType获取类型
  • 测试
    IsGenericType
  • 如果是,则使用
    GetGenericTypeDefinition()
  • 如果该类型等于
    typeof(Nullable)
    ,则有一个可为null的
  • 使用
    null.getUnderlineType(propertyInfo.PropertyType)
    • 有点麻烦:

      • PropertyInfo.PropertyType获取类型
      • 测试
        IsGenericType
      • 如果是,则使用
        GetGenericTypeDefinition()
      • 如果该类型等于
        typeof(Nullable)
        ,则有一个可为null的
      • 使用
        null.getUnderlineType(propertyInfo.PropertyType)

        • 您的问题不清楚。您可以使用
          .HasValue
          查找可为null的对象是否具有枚举或是否为null,但这似乎不是问题的目的。您是否使用反射获取变量类型并将IDataReader的数据从对象转换为该类型?

          您的问题不清楚。您可以使用
          .HasValue
          查找可为null的对象是否具有枚举或是否为null,但这似乎不是问题的目的。您是否使用反射来获取变量的类型,并将IDataReader的数据从对象强制转换为该类型?

          从IDataReader返回的列是否始终可以为null?如果是这样,一种简单的检查方法可能是:

          AnEnum? enumObj;
          if (enumObj.HasValue)
          {
            enumObj.Value.GetType().IsEnum();
          }
          

          希望能有所帮助。

          从IDataReader返回的列是否总是可空的?如果是这样,一种简单的检查方法可能是:

          AnEnum? enumObj;
          if (enumObj.HasValue)
          {
            enumObj.Value.GetType().IsEnum();
          }
          

          希望这能有所帮助。

          我也觉得这个问题并不十分清楚。我在我们的产品代码中使用了OregonGhost的技巧。当枚举列表很小时,这是很好的,但是随着层次结构的增长(读取超过100个条目),它会变得很慢

          我还喜欢在继承层次结构中存在跨多个类的概念(例如表示类中的字段/属性的枚举)时使用枚举值链:


          我也觉得这个问题并不十分清楚。我在我们的产品代码中使用了OregonGhost的技巧。当枚举列表很小时,这是很好的,但是随着层次结构的增长(读取超过100个条目),它会变得很慢

          我还喜欢在继承层次结构中存在跨多个类的概念(例如表示类中的字段/属性的枚举)时使用枚举值链:


          今天在工作中,我用COM类型做了一些反射。唉。泛型类型似乎并不是真的更好,即使它们是托管的;)可靠的回答,我的朋友。这里有一个if语句:var property=[mytype].GetType().GetProperty([propertyname]);如果(property.PropertyType.IsGenericType&&property.PropertyType.GetGenericTypeDefinition()==typeof(Nullable)&&typeof(Enum.IsAssignableFrom(Nullable.GetUnderlyingType(property.PropertyType)),我就用COM类型做了一些反射。唉。泛型类型似乎并不是真的更好,即使它们是托管的;)可靠的回答,我的朋友。这里有一个if语句:var property=[mytype].GetType().GetProperty([propertyname]);if(property.PropertyType.IsGenericType&&property.PropertyType.GetGenericTypeDefinition()==typeof(Nullable)&&typeof(Enum).IsAssignableFrom(Nullable.GetUnderlyingType(property.PropertyType)))