如何使用reflection将Int16值设置为Nullable 属性?

我需要这样做: –

MyClass.cs

using System; using System.Collections.Generic; using System.Text; namespace set_property__Enum_To_Nullable_Enum { public enum MyEnum : short { One, Two, Three } public class MyClass { public string MyStringProperty { get; set; } public MyEnum? MyEnumProperty { get; set; } public void ShowAll(string message) { Console.WriteLine(message); Console.WriteLine("String = " + MyStringProperty); Console.WriteLine("Enum = " + MyEnumProperty.Value); } } } 

Program.cs中

 using System; using System.Collections.Generic; using System.Text; using System.Reflection; namespace set_property__Enum_To_Nullable_Enum { class Program { static void Main(string[] args) { //Names string myAssemblyName = "MyAssembly"; string myNamespaceName = "set_property__Enum_To_Nullable_Enum"; string myClassName = "MyClass"; string propertyNameOne = "MyStringProperty"; string propertyNameTwo = "MyEnumProperty"; //Data string myString = "Hello World!"; short myInteger = 1; //Preprocessing Assembly myAssmbly = Assembly.Load(myAssemblyName); Type myType = myAssmbly.GetType(myNamespaceName + "." + myClassName); //Create class-instance object objectInstance = Activator.CreateInstance(myType); //Set property-values PropertyInfo propertyInfoOne = myType.GetProperty(propertyNameOne); propertyInfoOne.SetValue(objectInstance, myString, null); PropertyInfo propertyInfoTwo = myType.GetProperty(propertyNameTwo); propertyInfoTwo.SetValue(objectInstance, myInteger, null);//<--------------- //Call method myType.InvokeMember("ShowAll", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public, null, objectInstance, new object[] { "My name is Khan" }); string end = string.Empty; } } } 

但Int32值不会自动转换为MyEnum。

在特定行,正在生成exception。

 Object of type 'System.Int16' cannot be converted to type 'System.Nullable`1[set_property__Enum_To_Nullable_Enum.MyEnum]'. 

怎么做?

编辑

我需要进一步的帮助!

Enum.ToObject()无法处理null。

好的,在这种情况下你需要使用Enum.ToObject ,因为你正在使用reflection。 但是你还需要打开nullable来使用它, Nullable.GetUnderlyingType为你做了。

因此,您需要获取与MyEnum对应的Type

 Type nullableEnumType = propertyInfoTwo.PropertyType; Type enumType = Nullable.GetUnderlyingType(nullableEnumType); 

然后使用Enum.ToObject生成一个盒装的MyEnum实例, MyEnum包含您指定的值:

 object enumValue = Enum.ToObject(enumType, myInteger); 

所以,把它们放在一起:

 object enumValue = Enum.ToObject(Nullable.GetUnderlyingType(propertyInfoTwo.PropertyType), myInteger); propertyInfoTwo.SetValue(objectInstance, enumValue, null); 

编辑:

如果myInteger本身可以为空,你应该使用:

 object enumValue = myInteger.HasValue ? Enum.ToObject(Nullable.GetUnderlyingType(propertyInfoTwo.PropertyType), myInteger.Value); : null; 

刚施展出来的?

 propertyInfoTwo.SetValue(objectInstance, (MyEnum?)myInteger, null); 

使用int而不是short或

 enum MyEnum : Int16 

或者将short转换为int。

更新:试试

 short? MyInteger = 1;