【问题标题】:How to set an enum value on a dynamic Odata object如何在动态 Odata 对象上设置枚举值
【发布时间】:2016-09-16 13:48:04
【问题描述】:

我有一个 ODATA 服务,它返回类似于以下内容的动态对象:https://blogs.msdn.microsoft.com/leohu/2013/11/04/typeless-entity-object-support-in-webapi/

当我填充对象属性时,我会这样做:

 var entityCategory = new EdmEntityObject(entityType);
 bool bSuccess = entityCategory.TrySetPropertyValue("Name", "Category 1");

这很好用,但我无法设置我的任何 Enum 属性的值。这是我尝试过的:

var edmValue= new EdmEnumValue( new EdmEnumTypeReference( enumType, true ), value );
bool bSuccess = entityCategory.TrySetProperty( "Status", edmValue );

但这不起作用,我只是在响应中得到 null 。 bSuccesstrue,如果我之后调用TryGetValue,它甚至还有预期值。

但是,在 web 响应状态仍然显示为 NULL。

我尝试了很多变体,但似乎没有任何效果。

任何想法我做错了什么?

找到解决方案

这就是最终对我有用的方法:

var oEnumObject = new EdmEnumObject( enumType, strEnumValue );
entity.TrySetPropertyValue( fieldName, oEnumObject );

不知道为什么我需要使用 EdmEnumObject,但它似乎可以工作。它实际上会接受并显示 strEnumValue 的任何字符串值。

这些都不起作用

更多信息:

当我向数据模型添加枚举时,我会执行以下操作:

var enumType = new EdmEnumType( Namespace, "Status", EdmPrimitiveTypeKind.Int64, false);
enumType.AddMember( "Active", 0);
..
AddProperty( EdmStructuralProperty( this, field.Name, new EdmEnumTypeReference( thisEnum, bIsNullable ) )

我在这里缓存enumType 的值,稍后在填充时使用它(在上面的代码中)。因此,我认为enumType 是有效的。至于value,我有一些代码可以选择正确的EdmEnumMember,但我也只是尝试将它硬编码到列表中的第一个,它仍然显示为null

var edmValue = new EdmEnumValue( new EdmEnumTypeReference( enumType, true ), enumType.Members.First() );

那到底是怎么回事?我在那里打了一个断点,它似乎有正确的值,但我在响应中得到 null。我也试过这个:

var value = new ODataEnumValue( nEnumIntValue.ToString(), enumType.FullName() );
entity.TrySetPropertyValue( col.ColumnName, value );

再次,NULL。任何帮助将不胜感激!

【问题讨论】:

  • 您遗漏了一些可能有用的变量。出示您的enumTypevalue 声明。
  • 添加了更多代码..很高兴回答任何其他问题

标签: c# asp.net-web-api odata


【解决方案1】:

引用following test on github 敌人EdmEnumType

您应该看看您是如何创建成员并将其添加到enumType...

//make sure you enum type is not nullable
var enumType = new EdmEnumType(Namespace, "Status", EdmCoreModel.Instance.GetInt32(false).PrimitiveDefinition(), false);

//enum members are made up of constants
var enumMember = enumType.AddMember("Active", new EdmIntegerConstant(0));

//You should also not make the value nullable
var edmValue = new EdmEnumValue(new EdmEnumTypeReference(enumType, false), enumMember);

【讨论】:

  • 感谢您的帮助,我终于想通了。不确定你的回答是否有帮助,但它至少让我有再试一次的意愿。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 2016-03-04
  • 1970-01-01
  • 2010-11-09
  • 2020-03-17
  • 2020-11-30
相关资源
最近更新 更多