zorba111
asked on
WCF enums not functioning like "vanilla" enums
Ok, so to confirm the behaviour of "vanilla" enums, I wrote this test code:
As you'd expect, the first call to Enum.IsDefined() returns false, and the second returns true (as 10 is *not* in the enum, but 1 *is*).
Ok, but this behaviour is not working in my WCF client, using a WCF-generated enum:
The problem is, in the code above, that even when the combo-box is returning "valid" values, (10-16, inclusive), the Enum.IsDefined() call is returning false....
Why is the WCF enum acting differently? It must be all the macros and attributes. But why?
It would be much easier to work with if WCF enums allowed us to distinguish between valid enums in range and not in range.
********** UPDATE *********************
I did some reading up and found a routine to confirm at run-time the names and values of an enum.
I found that the values of our WCF enum were *not* what I expected....
This code:
Produces this output in the String sResult:
Name: Item16, Value: 0
Name: Item10, Value: 1
Name: Item11, Value: 2
Name: Item12, Value: 3
Name: Item13, Value: 4
Name: Item14, Value: 5
Name: Item15, Value: 6
So the names *do not map* nicely onto the values.
I've been told to return strings in the range "10" to "16" in the XML message.
enum EmpType
{
Grunt,
Contractor,
Manager,
VicePresident
}
// in Main() or a method somehwere....
EmpType emp = (EmpType)10;
Boolean bIsDefined = Enum.IsDefined(typeof(EmpType), emp);
emp = (EmpType)1;
bIsDefined = Enum.IsDefined(typeof(EmpType), emp);
As you'd expect, the first call to Enum.IsDefined() returns false, and the second returns true (as 10 is *not* in the enum, but 1 *is*).
Ok, but this behaviour is not working in my WCF client, using a WCF-generated enum:
// definition of the enum "JobLevelIdEnum" in the generated reference.cs file:
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.5483")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.monster.com/Monster")]
public enum JobLevelIdEnum {
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("16")]
Item16,
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("10")]
Item10,
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("11")]
Item11,
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("12")]
Item12,
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("13")]
Item13,
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("14")]
Item14,
/// <remarks/>
[System.Xml.Serialization.XmlEnumAttribute("15")]
Item15,
}
// then in my code, we get a value from a combo-box, which I want to confirm is A VALID MEMBER of the enum....
// otherwise we can use the DEFAULT member of the enum...
// O) job-info -> level
// we get a string from the combo box, but monster needs an enum (JobLevelIdEnum)
JobLevelEnumStr jobLevel = new JobLevelEnumStr();
Int32 iLevel = (Int32.Parse(vac.MONSTERlevel));
JobLevelIdEnum level = (JobLevelIdEnum)iLevel;
// next, check that the number returned from the combobox is in the actual enum range
if (Enum.IsDefined(typeof(JobLevelIdEnum), level))
jobLevel.monsterId = level;
else
jobLevel.monsterId = JobLevelIdEnum.Item16; // which is the "none of these" option
The problem is, in the code above, that even when the combo-box is returning "valid" values, (10-16, inclusive), the Enum.IsDefined() call is returning false....
Why is the WCF enum acting differently? It must be all the macros and attributes. But why?
It would be much easier to work with if WCF enums allowed us to distinguish between valid enums in range and not in range.
********** UPDATE *********************
I did some reading up and found a routine to confirm at run-time the names and values of an enum.
I found that the values of our WCF enum were *not* what I expected....
This code:
Array enums = Enum.GetValues(typeof(JobLevelIdEnum));
String sResult = null;
for (int i = 0; i < enums.Length; i++)
{
sResult += String.Format("Name: {0}, Value: {0:D}\r\n", enums.GetValue(i));
}
Produces this output in the String sResult:
Name: Item16, Value: 0
Name: Item10, Value: 1
Name: Item11, Value: 2
Name: Item12, Value: 3
Name: Item13, Value: 4
Name: Item14, Value: 5
Name: Item15, Value: 6
So the names *do not map* nicely onto the values.
I've been told to return strings in the range "10" to "16" in the XML message.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER