2

In C#, I have the enum data type:

public enum DebugLevel
{
    NONE = 0,
    ERROR = 1,
    ...
}

inside an object:

public class DataOptions
{
    #region Fields
    public DebugLevel debug = DebugLevel.NONE;
    ...

and the data is provided via POST in a FormData as an int:

Form Data:
    debug: 0

and is then parsed in a WebAPI like this:

[HttpPost]
public AjaxAnswer<SomeDataType[]> MyEndpoint(HttpRequestMessage req) {
    DataOptions o = null;
    try
    {
        o = req.DecodeJSON<DataOptions>();
    }
    catch (Newtonsoft.Json.JsonReaderException) // Not JSON - old frontend versions are sending as form data
    {
        try { 
            o = req.DecodeFormData<DataOptions>();
        } catch(Exception e) {
            return new AjaxAnswer<SomeDataType[]>() {success:false, data:new SomeDataType[0], Error: "Error in MyEndpoint", ErrorMessage: "Could not decode request payload: " + e.Message
        }
}

DecodeFormData is a custom Extension Method which looks like this:

public static T DecodeFormData<T>(this System.Net.Http.HttpRequestMessage req) where T : new()
{
    string postdata = req.Content.ReadAsStringAsync().Result;
    Dictionary<string, string> s = postdata.Split('&').Where(x=>x.Contains('=')).Select(x => x.Split('=')).ToDictionary(x => x[0], x => HttpContext.Current.Server.UrlDecode(x[1]));

    return s.ToType<T>();
}

For some reason, this code throws the error:

Invalid cast from 'System.String' to 'MyNamespace.DebugLevel'

Conversions without that enum run through fine. What is happening there (behind the s.ToType<T>() line) and why?

Alexander
  • 19,906
  • 19
  • 75
  • 162

1 Answers1

4

To convert a string to an enum, use Enum.Parse(...).

See here for more info.

Community
  • 1
  • 1
wkl
  • 1,896
  • 2
  • 15
  • 26