如何使用反射将Int16值设置为Nullable <Enum>属性?

use*_*312 4 c# reflection .net-2.0

我需要这样做: -

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

在特定行,正在生成异常.

Object of type 'System.Int16' cannot be converted to type 'System.Nullable`1[set_property__Enum_To_Nullable_Enum.MyEnum]'.
Run Code Online (Sandbox Code Playgroud)

怎么做?

编辑

我需要进一步的帮助!

Enum.ToObject()无法处理null.

the*_*oop 9

好的,你需要Enum.ToObject在这种情况下使用,因为你正在使用反射.但是你还需要打开可以使用它的nullable,这Nullable.GetUnderlyingType对你有帮助.

所以,你需要得到Type相应的MyEnum:

Type nullableEnumType = propertyInfoTwo.PropertyType;
Type enumType = Nullable.GetUnderlyingType(nullableEnumType);
Run Code Online (Sandbox Code Playgroud)

然后用于Enum.ToObject生成MyEnum带有您指定值的盒装实例:

object enumValue = Enum.ToObject(enumType, myInteger);
Run Code Online (Sandbox Code Playgroud)

所以,把它们放在一起:

object enumValue = Enum.ToObject(Nullable.GetUnderlyingType(propertyInfoTwo.PropertyType), myInteger);
propertyInfoTwo.SetValue(objectInstance, enumValue, null);
Run Code Online (Sandbox Code Playgroud)

编辑:

如果可以myInteger为空,那么你应该使用:

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