Как я могу использовать извлеченную строку в качестве уже существующего имени объекта enum? - PullRequest
0 голосов
/ 08 мая 2018

Итак,

Просто чтобы прояснить, я уже просмотрел это Q & A, и это не мой вопрос.

Теперь, мой вопрос, у меня есть строка, которую я могу извлечь из Excel и разбить ее с помощью разбиения и другими методами и выяснить, является ли это перечислением или нет.

Например:

string enumStr = "eSomeEnumObject RANDOMENUMVAL" 

- это строка, и я могу разбить ее и проверить, является ли она перечислением, и получить массив строк как таковой:

string[] enumArr = { "SomeEnumObject", "RANDOMENUMVAL" };

Теперь мне нужно использовать его в class TestClass, который ссылается на библиотеку, которая также содержит различные определения методов и перечисления. Имя и значение объекта enum, которые я только что извлек, в основном уже существует. Теперь я знаю, что для преобразования строки в перечисляемое значение мы используем что-то вроде этого:

SomeEnumObject enumobj = (SomeEnumObject)Enum.Parse(typeof(SomeEnumObject, "RANDOMENUMVAL");

Теперь мой вопрос:

Как мне получить это имя объекта enum, которое у меня есть в виде строки, записать как тип объекта enum, динамически, так как я пытаюсь автоматизировать процесс, потому что, очевидно, когда я пытаюсь написать:

enumArr[0] enumobj = (enumArr[0])Enum.Parse(typeof(enumArr[0], enumArr[1]);

он выдаст ошибку, потому что не может проанализировать строку как перечисление.

Итак, есть ли способ сделать это без переопределения enum?

Спасибо!

1 Ответ

0 голосов
/ 08 мая 2018

Вам нужно использовать Type.GetType() или Assembly.GetType(), чтобы получить тип.

Вам нужно знать:

  • Сборка находится в
  • Полное имя (например, с пространством имен)

Если enum находится в той же сборке, что и вызывающий код, вы можете просто использовать Type.GetType(fullyQualifiedName).Если он находится в другой сборке, вам нужно либо создать имя с указанием сборки, либо найти сборку (например, используя другой тип, который вы знаете во время компиляции) и вызвать GetType для сборки.

КогдаВы проанализировали значение перечисления, тип времени компиляции будет object, но это действительно будет (в штучной упаковке) значение из перечисления.На этом этапе вы можете:

  • Сохранить как object, если вам больше ничего не нужно
  • Использовать его динамически с ключевым словом dynamic
  • Преобразуйте его обратно в строку, используя ToString() (которая может не дать вам ту же строку, с которой вы начали, например, если существует несколько имен для одного и того же значения)
  • Распакуйте ее в базовый тип.Вы можете хорошо знать базовый тип, даже если вы не знаете enum

Вы не можете объявить переменную, используя значение переменной во время выполнения в качестве типа, потому чтокомпилятор должен знать тип в время компиляции .Но вам может помочь один из вариантов выше.

Вот полный пример:

using System;

namespace TestApp
{
    public enum Foo
    {
        Bar = 123
    }

    public class Program
    {
        static void Main()
        {
            // You've parsed these out already
            string name = "Foo";
            string value = "Bar";

            // Work out the fully-qualified name and fetch
            // the type. We use the namespace of a type that
            // we know is in the same namespace as the enum we're
            // looking for.
            string ns = typeof(Program).Namespace;
            string fqn = $"{ns}.{name}";
            Type type = Type.GetType(fqn);
            if (type == null)
            {
                throw new Exception($"Unknown type: {fqn}");
            }

            // Parse the value
            object enumValue = Enum.Parse(type, value);
            Console.WriteLine((int) enumValue); // 123
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...