如何使用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;