带反射的.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()
- 如果该类型等于
,则有一个可为null的typeof(Nullable)
- 使用
null.getUnderlineType(propertyInfo.PropertyType)
- 从
PropertyInfo.PropertyType获取类型
- 测试
IsGenericType
- 如果是,则使用
GetGenericTypeDefinition()
- 如果该类型等于
,则有一个可为null的typeof(Nullable)
- 使用
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)))