Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将提取的字符串用作已存在的枚举对象名称?_C#_.net_Enums - Fatal编程技术网

C# 如何将提取的字符串用作已存在的枚举对象名称?

C# 如何将提取的字符串用作已存在的枚举对象名称?,c#,.net,enums,C#,.net,Enums,所以 我已经看过问答了,这不是我的问题 现在,我的问题是,我有一个字符串,我可以从Excel中提取,并通过拆分和其他方法将其分解,然后确定它是否是枚举 例如: string enumStr = "eSomeEnumObject RANDOMENUMVAL" 是字符串,我可以拆分并检查它是否为枚举,并获取字符串数组,如下所示: string[] enumArr = { "SomeEnumObject", "RANDOMENUMVAL" }; 现在,我需要在一个类TestClass中使用它,该

所以

我已经看过问答了,这不是我的问题

现在,我的问题是,我有一个字符串,我可以从Excel中提取,并通过拆分和其他方法将其分解,然后确定它是否是枚举

例如:

string enumStr = "eSomeEnumObject RANDOMENUMVAL" 
是字符串,我可以拆分并检查它是否为枚举,并获取字符串数组,如下所示:

string[] enumArr = { "SomeEnumObject", "RANDOMENUMVAL" };
现在,我需要在一个
类TestClass
中使用它,该类引用了一个库,该库还包含各种方法定义和枚举。 我刚才提取的枚举对象名称和值基本上已经存在于那里。现在,我知道要将字符串转换为枚举值,我们需要使用如下内容:

SomeEnumObject enumobj = (SomeEnumObject)Enum.Parse(typeof(SomeEnumObject, "RANDOMENUMVAL");
现在我的问题是:

既然我正在尝试自动化该过程,那么如何动态地获取作为字符串的枚举对象名,并将其作为枚举对象类型写入,因为很明显,当我尝试写入时:

enumArr[0] enumobj = (enumArr[0])Enum.Parse(typeof(enumArr[0], enumArr[1]);
它将抛出错误,因为它无法将字符串解析为枚举

那么现在,有没有一种不用重新定义枚举就可以做到这一点的方法


谢谢

您需要使用
Type.GetType()
Assembly.GetType()
来获取类型

您需要知道:

  • 它所在的集合
  • 完全限定名(例如,带有命名空间)
如果枚举与调用代码位于同一程序集中,则可以使用
Type.GetType(fullyQualifiedName)
。如果它位于不同的程序集中,则需要创建一个程序集限定名,或者查找该程序集(例如,使用编译时知道的另一种类型),然后对该程序集调用
GetType

解析枚举值后,编译时类型将是
对象
,但它实际上是枚举中的(装箱)值。此时,您可以:

  • 如果您不需要其他任何东西,请将其保留为
    对象
  • dynamic
    关键字一起动态使用它
  • 使用
    ToString()
    将其转换回字符串(这可能不会为您提供开始时使用的相同字符串,例如,如果同一值有多个名称)
  • 将其取消绑定到基础类型。即使您不知道枚举,也可能知道底层类型
不能使用变量的运行时值作为类型来声明变量,因为编译器需要在编译时知道该类型。但是上面的一个选项应该对你有帮助

下面是一个完整的示例:

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
        }
    }
}

您需要使用
Type.GetType()
Assembly.GetType()
来获取类型

您需要知道:

  • 它所在的集合
  • 完全限定名(例如,带有命名空间)
如果枚举与调用代码位于同一程序集中,则可以使用
Type.GetType(fullyQualifiedName)
。如果它位于不同的程序集中,则需要创建一个程序集限定名,或者查找该程序集(例如,使用编译时知道的另一种类型),然后对该程序集调用
GetType

解析枚举值后,编译时类型将是
对象
,但它实际上是枚举中的(装箱)值。此时,您可以:

  • 如果您不需要其他任何东西,请将其保留为
    对象
  • dynamic
    关键字一起动态使用它
  • 使用
    ToString()
    将其转换回字符串(这可能不会为您提供开始时使用的相同字符串,例如,如果同一值有多个名称)
  • 将其取消绑定到基础类型。即使您不知道枚举,也可能知道底层类型
不能使用变量的运行时值作为类型来声明变量,因为编译器需要在编译时知道该类型。但是上面的一个选项应该对你有帮助

下面是一个完整的示例:

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
        }
    }
}

所以,基本上,.@CodeCaster:我们的目标是解析一个枚举值。我已经添加了一个额外的段落和列表,说明OP可以对解析结果做些什么。@DaisyShipton谢谢你的回答。这很有帮助。因为它是当前程序集之外的引用程序集,所以我必须使用程序集限定名,后跟引用程序集的名称作为字符串<代码>类型类型=类型.GetType($“{qualifiedName},“AssemblyNameAsString”)在运行之前,我必须先处理其他模块,所以我还不知道这是否对我有效,但我会让你知道的!再次感谢!:)@Dr.Ameto:希望它能起作用-如果你已经有了对程序集的引用,我个人更喜欢使用
assembly.GetType
而不是将程序集名称输入字符串,但不同的用例以不同的方式工作得更好。@DaisyShipton是的,在我的例子中,以字符串形式获取程序集名称要简单得多。因此,基本上,。@CodeCaster:还有一点,目标是解析枚举值。我添加了一个额外的段落,并列出OP可以对pa的结果做些什么rsing.@DaisyShipton感谢您的回答。这很有帮助。因为它是当前程序集之外的引用程序集,所以我必须使用程序集限定名,后跟引用的程序集名称作为字符串。
Type Type=Type.GetType($”{qualifiedName},“AssemblyNameAsString”)在运行之前,我必须处理其他模块,所以我还不知道这是否适用于我,但我会让你知道!再次感谢!:)@Ameto博士:希望它能起作用-如果你已经有了对程序集的引用,我个人更喜欢使用
assembly.GetType
而不是将程序集名称放入字符串中,但是不同的用例以不同的方式工作得更好。@DaisyShipton是的,在我的例子中,将程序集名称作为字符串来获取要容易得多。