Отражение в C # - PullRequest
       44

Отражение в C #

0 голосов
/ 08 декабря 2011

Я недавно начал разработку на c # и хочу использовать отражение в следующей ситуации. Если у меня есть класс Enum как

Enum Operation
{
  Read=0;
  Write;
} 

Если я введу как

String str = "Operation.Write";

Я смогу получить вывод как 1;

Или

если константы определены как

const int Read=0;
const int Write=1;

Если ввод

String str = "Read";

вывод должен быть 0

Пожалуйста, помогите.

Ответы [ 3 ]

3 голосов
/ 08 декабря 2011

Вы можете использовать Enum.Parse , чтобы иметь эту функцию.

Если мы объединим ваши предложения, мы можем получить что-то вроде этого.

public static Operation getOperationByName(String name)  {
    return Enum.Parse(typeof(Operation),name);
}

Если имя не должно быть нулевым и представлять имя или позицию в enum, т.е.

"Read" вернет Operation.Rerad и "1" вернет Operation.Write

1 голос
/ 08 декабря 2011

Вот полный код, чтобы также получить тип Enum через Reflection без его жесткого кодирования. Метод ParseConstant также является общим, s.t. Вы можете использовать, если для каждого типа.

    namespace MyNamgespace
{
    public enum Operation
    {
        Read = 0,
        Write
    }

    public class ClassWithConstants
    {
        public const int Read = 0;
        public const int Write = 1;
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine((ParseEnum("Operation.Write")));
            Console.WriteLine((ParseContant<ClassWithConstants>("Write")));
            Console.ReadLine();
        }

        static int ParseEnum(string enumValue)
        {
            var typeName = enumValue.Split('.')[0];
            var valueName = enumValue.Split('.')[1];

            var enumType = Type.GetType(string.Format("MyNamespace.{0}", typeName));
            var op = (Operation) Enum.Parse(enumType, valueName);

            return (int)op;
        }


        static int ParseContant<T>(string constantName)
        {
            var type = typeof (T);
            var field = type.GetField(constantName, BindingFlags.Static | BindingFlags.Public);
            return (int)field.GetValue(null);
        }
    }
}
1 голос
/ 08 декабря 2011

var name = Enum.GetName(typeof(Operation), Operation.Write) //name = 'Write'

var value = Enum.Parse(typeof(Operation), "Write") //value = Operation.Write

...