Как установить значение Int16 для свойства Nullable <Enum>, используя отражение? - PullRequest
4 голосов
/ 22 декабря 2011

Мне нужно сделать это: -

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.

В конкретной строке генерируется исключение.

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

Как это сделать?

Редактировать

Мне нужна дополнительная помощь, пожалуйста!

Enum.ToObject () не может обработать ноль.

Ответы [ 3 ]

9 голосов
/ 22 декабря 2011

ОК, в этом случае вам нужно использовать Enum.ToObject, так как вы используете отражение.Но вам также нужно распаковать обнуляемое значение, чтобы использовать то, что Nullable.GetUnderlyingType делает для вас.

Итак, вам нужно получить Type, соответствующий MyEnum:

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

затем используйте Enum.ToObject, чтобы создать в штучной упаковке экземпляр 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;
1 голос
/ 22 декабря 2011

Просто разыграть?

propertyInfoTwo.SetValue(objectInstance, (MyEnum?)myInteger, null);
0 голосов
/ 22 декабря 2011

используйте int вместо short или

enum MyEnum : Int16 

или конвертируйте short в int.

update: try

short? MyInteger = 1;
...