Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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中的枚举列表#_C# - Fatal编程技术网

C# 打印特定命名空间C中的枚举列表#

C# 打印特定命名空间C中的枚举列表#,c#,C#,有没有办法打印C#类库或命名空间中的所有枚举?我希望打印名称及其值 例如,如果我的命名空间如下所示: namespace MyCompany.SystemLib { public enum ItemStatus { None = 0, Active = 1, Inactive = 2 } public enum MyEnum { EnumVal1 = 1, EnumV

有没有办法打印C#类库或命名空间中的所有枚举?我希望打印名称及其值

例如,如果我的命名空间如下所示:

namespace MyCompany.SystemLib
{
    public enum ItemStatus
    {
        None = 0,
        Active = 1,
        Inactive = 2    
    }

    public enum MyEnum
    {
        EnumVal1 = 1,
        EnumVal2 = 2,
        EnumVal3 = 3,

    }   
}
我想把它们打印成下面的分隔符(到一个文本文件中),为清晰起见,这里不需要输出

  • ItemStatus,无=0,活动=1,非活动=1
  • MyEnum,EnumVal1=1,EnumVal2=2,EnumVal3

我不知道从哪里开始。感谢您的帮助。

尝试使用该方法。

尝试使用该方法。

反思救援

List<string> allEnums = new List<string>();
var allTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(assembly => assembly.GetTypes());

foreach (Type type in allTypes)
{
    if (type.Namespace == "MyCompany.SystemLib" && type.IsEnum)
    {
        string enumLine = type.Name + ",";
        foreach (var enumValue in Enum.GetValues(type))
        {
            enumLine += enumValue + "=" + ((int)enumValue).ToString() + ",";
        }

        allEnums.Add(enumLine);
    }
}
List allEnums=new List();
var allTypes=AppDomain.CurrentDomain.getAssemblys().SelectMany(assembly=>assembly.GetTypes());
foreach(所有类型中的类型)
{
if(type.Namespace==“MyCompany.SystemLib”&&type.IsEnum)
{
字符串enumLine=type.Name+“,”;
foreach(Enum.GetValues(类型)中的变量enumValue)
{
enumLine+=enumValue+“=”+((int)enumValue).ToString()+”,”;
}
添加(枚举行);
}
}
第一行遍历当前加载到内存中的所有程序集(因为名称空间可以分散在许多DLL和EXE中),并过滤掉正确名称空间中的程序集,即枚举。如果您愿意,可以将其简化为LINQ查询


内部循环遍历枚举的值,并使用GetName将字符串与值匹配。

反射到rescue

List<string> allEnums = new List<string>();
var allTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(assembly => assembly.GetTypes());

foreach (Type type in allTypes)
{
    if (type.Namespace == "MyCompany.SystemLib" && type.IsEnum)
    {
        string enumLine = type.Name + ",";
        foreach (var enumValue in Enum.GetValues(type))
        {
            enumLine += enumValue + "=" + ((int)enumValue).ToString() + ",";
        }

        allEnums.Add(enumLine);
    }
}
List allEnums=new List();
var allTypes=AppDomain.CurrentDomain.getAssemblys().SelectMany(assembly=>assembly.GetTypes());
foreach(所有类型中的类型)
{
if(type.Namespace==“MyCompany.SystemLib”&&type.IsEnum)
{
字符串enumLine=type.Name+“,”;
foreach(Enum.GetValues(类型)中的变量enumValue)
{
enumLine+=enumValue+“=”+((int)enumValue).ToString()+”,”;
}
添加(枚举行);
}
}
第一行遍历当前加载到内存中的所有程序集(因为名称空间可以分散在许多DLL和EXE中),并过滤掉正确名称空间中的程序集,即枚举。如果您愿意,可以将其简化为LINQ查询


内部循环遍历枚举的值,并使用GetName将字符串与值匹配。

当然可以使用
LINQ
反射来完成

var asm = Assembly.LoadFrom("path of the assembly");
var enums = asm.GetTypes().Where(x => x.IsEnum).ToList();

var result = enums
            .Select(
                x =>
                    string.Format("{0},{1}", x.Name,
                        string.Join(",",Enum.GetNames(x)
                        .Select(e => string.Format("{0}={1}", e, (int)Enum.Parse(x, e))))));

File.WriteAllLines("path", result);

当然可以使用
LINQ
Reflection
来完成

var asm = Assembly.LoadFrom("path of the assembly");
var enums = asm.GetTypes().Where(x => x.IsEnum).ToList();

var result = enums
            .Select(
                x =>
                    string.Format("{0},{1}", x.Name,
                        string.Join(",",Enum.GetNames(x)
                        .Select(e => string.Format("{0}={1}", e, (int)Enum.Parse(x, e))))));

File.WriteAllLines("path", result);

请看一下.NET反射机制。这应该给您一个领先的开始。您可能正在寻找类System.Enum。它有GetValues和GetNames方法,这可能是您所需要的。要查找程序集中的所有枚举,您需要使用反射。您当然可以从给定程序集中获取枚举列表(假设权限正确,依此类推)。这是你的问题吗?或者你只是想了解GetValues和GetNames方法?这可能会对你有所帮助:我感谢大家的帮助。对于落选的选民来说,认真地问一个问题会让他们落选吗?请看一下.NET的反射机制。这应该给您一个领先的开始。您可能正在寻找类System.Enum。它有GetValues和GetNames方法,这可能是您所需要的。要查找程序集中的所有枚举,您需要使用反射。您当然可以从给定程序集中获取枚举列表(假设权限正确,依此类推)。这是你的问题吗?或者你只是想了解GetValues和GetNames方法?这可能会对你有所帮助:我感谢大家的帮助。对于落选的选民来说,认真地提问会获得落选票?它会打印ItemStatus,None=None,Active=Active,Inactive=Inactive。我正在尝试处理它。enumLine+=Enum.GetName(类型,enumValue)+“=”+((int)enumValue.ToString()+”,”;修复了它。在这种情况下,您根本不需要Enum.GetName.:)是的。取出GetName。它打印ItemStatus,None=None,Active=Active,Inactive=Inactive。我正在尝试处理它。enumLine+=Enum.GetName(类型,enumValue)+“=”+((int)enumValue.ToString()+”,”;修复了它。在这种情况下,您根本不需要Enum.GetName.:)是的。取出GetName。