Установить свойство enum класса динамически в C# - PullRequest
3 голосов
/ 07 января 2020

Я использую. net ядро ​​3.1, и у меня есть метод FillData. Я хочу установить случайным образом (или это может быть первое значение enum) значение enum для моего объекта , но я не могу этого достичь. Как написать комментарий ниже? Приведенный ниже код можно воспроизвести, скопировав его непосредственно в https://dotnetfiddle.net/

using System;
using System.Reflection;

public class Program
{
    public static void Main()
    {
        var wantedObject = MyHelper.FillData<Student>();
        Console.WriteLine(wantedObject.Gender);
    }

    public static class MyHelper
    {
        public static T FillData<T>()
        {
            Type type = typeof(T);
            PropertyInfo[] properties = type.GetProperties();
            var resultObject = (T)Activator.CreateInstance(typeof(T), new object[]{});
            foreach (PropertyInfo property in properties)
            {
                if (property.PropertyType == typeof(string))
                {
                    property.SetValue(resultObject, "asdf");
                }
                else if (property.PropertyType.BaseType.FullName == "System.Enum")
                {
                    // property.SetValue(resultObject, ???????? );
                }
            }

            return resultObject;
        }
    }

    public class Student
    {
        public string Name{get;set;}
        public string Surname{get;set;}
        public GenderEnum Gender{get;set;}
        public LevelEnum Level{get;set;}
    }

    public enum GenderEnum
    {
        Male = 1,
        Female = 2,
    }

    public enum LevelEnum
    {
        High = 1,
        Low = 2,
    }
}

Ответы [ 2 ]

3 голосов
/ 07 января 2020

Получите доступные значения Enum.GetValues(Type), затем выберите случайное значение

Например

//...

Array values = Enum.GetValues(property.PropertyType);
int index = random.Next(0, values.Length - 1); //Assuming a Random class
object value = values.GetValue(index);

property.SetValue(resultObject, value);

//...
1 голос
/ 07 января 2020

Если вы хотите установить значение по умолчанию, то вы можете использовать атрибут [DefaultValue].

using System;
using System.Reflection;
using System.ComponentModel;

public class Program
{
    public static void Main()
    {
        var wantedObject = MyHelper.FillData<Student>();
        Console.WriteLine(wantedObject.Gender);
    }

    public static class MyHelper
    {
        public static T FillData<T>()
        {
            Type type = typeof(T);
            PropertyInfo[] properties = type.GetProperties();
            var resultObject = (T)Activator.CreateInstance(typeof(T), new object[]{});
            foreach (PropertyInfo property in properties)
            {
                if (property.PropertyType == typeof(string))
                {
                    property.SetValue(resultObject, "asdf");
                }
                else if (property.PropertyType.BaseType.FullName == "System.Enum")
                {
                   DefaultValueAttribute[] attributes = property.PropertyType.GetCustomAttributes(typeof(DefaultValueAttribute), false) as DefaultValueAttribute[];
                   if (attributes != null && attributes.Length > 0)
                        property.SetValue(resultObject, attributes[0].Value);
                    else
                    //..do something here to get a random value.
                        property.SetValue(resultObject, 0);
                }
            }

            return resultObject;
        }
    }

    public class Student
    {
        public string Name{get;set;}
        public string Surname{get;set;}
        public GenderEnum Gender{get;set;}
        public LevelEnum Level{get;set;}
    }

    [DefaultValue(Male)]
    public enum GenderEnum
    {
        Male = 1,
        Female = 2,
    }

    [DefaultValue(High)]
    public enum LevelEnum
    {
        High = 1,
        Low = 2,
    }
}
...