如何通过反射区分value-type,nullable value-type,enum,nullable-enum,reference-types?
enum MyEnum
{
One,
Two,
Three
}
class MyClass
{
public int IntegerProp { get; set; }
public int? NullableIntegerProp { get; set; }
public MyEnum EnumProp { get; set; }
public MyEnum? NullableEnumProp { get; set; }
public MyClass ReferenceProp { get; set; }
}
class Program
{
static void Main(string[] args)
{
Type classType = typeof(MyClass);
PropertyInfo propInfoOne = classType.GetProperty("IntegerProp");
PropertyInfo propInfoTwo = classType.GetProperty("NullableIntegerProp");
PropertyInfo propInfoThree = classType.GetProperty("EnumProp");
PropertyInfo propInfoFour = classType.GetProperty("NullableEnumProp");
PropertyInfo propInfoFive = classType.GetProperty("ReferenceProp");
propInfoOne.???
...............
...............
}
}
在propInfo ...中哪些地方可以检索到这些信息?
答案 0 :(得分:6)
以下是检查enum,nullable,primitve和value类型的方法;
Console.WriteLine(propInfoOne.PropertyType.IsPrimitive); //true
Console.WriteLine(propInfoOne.PropertyType.IsValueType); //false, value types are structs
Console.WriteLine(propInfoThree.PropertyType.IsEnum); //true
var nullableType = typeof (Nullable<>).MakeGenericType(propInfoThree.PropertyType);
Console.WriteLine(nullableType.IsAssignableFrom(propInfoThree.PropertyType)); //true
请注意,值类型和基元是不同的东西。基元只是映射到类型的简写(例如bool&gt; System.Boolean)。值类型按值传递;它们是struct(ure)而不是类。
答案 1 :(得分:2)
public void Test(Type desiredType, object value)
{
if (desiredType.IsGenericType)
{
if (desiredType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
if (value == null)
{
}
}
}
}
答案 2 :(得分:0)
PropertyType.Name
似乎为Non Nullable和Nullable类型提供了不同的输出。可能这对你有点帮助。
实际上它将 Nullable`1 Int32 作为Nullable和Non nullable的输出。