jbevain / cecil

Cecil is a library to inspect, modify and create .NET programs and libraries.
MIT License
2.73k stars 624 forks source link

How can I set constant value to an enum field when creating a new enum #922

Open SwingCosmic opened 1 year ago

SwingCosmic commented 1 year ago

I can't set value to FieldDefinition.Constant and FieldDefinition.HasConstant because it depends on the constant value inside of the assembly module.

private TypeDefinition CloneEnum(TypeDefinition type,  ModuleDefinition target)
{
    var baseType = target.ImportReference(typeof(Enum));
    var newEnum = new TypeDefinition(type.Namespace, type.Name, type.Attributes, baseType);

    Console.WriteLine(type.Name);
    foreach (var f in type.Fields)
    {
        FieldDefinition field;
        if (!f.HasConstant) // value__
        {
            field = new FieldDefinition(f.Name, f.Attributes, target.TypeSystem.Int32);
        } else
        {
            field = new FieldDefinition(f.Name, f.Attributes, newEnum);
            // next two lines doesn't work
            field.HasConstant = true; //still false
            field.Constant = f.Constant; // still null
        }
        newEnum.Fields.Add(field);
    }
    return newEnum;
}

The result assembly contains the enums without any values.

image

And I'am really confused about this two properties:

image

image