Member 12885549 Ответов: 2

Значение параметра свойства перечислимого типа


У меня есть перечисление, и это свойство, которое я хочу обнулить. Есть пара способов, которыми я пытался это сделать, но у меня ничего не получается. Я получаю "Object of type 'System.Int32' cannot be converted to type 'System.Nullable`1[Data2.Models.MyObject+TypeFlag]'." но разве он не должен разрешать обнуляемое перечисление, если я установлю его таким образом?

Он разбивается на
prop.SetValue(item, val, null);

где prop-мое свойство nullable, item-весь объект, а val-значение enum (null, 1, 2 и т. д)

Что я уже пробовал:

public enum Types: int {
  Good = 1,
    Medium = 2,
    Critical = 3,
}

[Column("types")]
[JsonProperty(PropertyName = "types")]
public Types? TypeFlag {
  get;
  set;
}


//second try 

[Column("types")]
[JsonProperty(PropertyName = "types")]
public TypeFlag ? TypeFlag {
  get {
    if (this.TypeFlag == null) {
      this.TypeFlag =
        default (TypeFlag);
    }

    return this.TypeFlag;
  }

  set {
    this.TypeFlag = value;
  }
}

Я также попытался изменить свою настройку значения следующим образом:
var enumType = default(T) == null && typeof(T).BaseType != null && "ValueType".Equals(typeof(T).BaseType.Name);

var convertedValue = enumType ? Convert.ChangeType(val, prop.PropertyType) : val;
prop.SetValue(item, convertedValue, null);

но это не помогло.

Richard Deeming

Это ArgumentException не NullReferenceException.

Я исправил название вашего вопроса для вас.

2 Ответов

Рейтинг:
7

Richard Deeming

Convert.ChangeType похоже, он не работает с типами перечислений. Вам нужно будет использовать Перечисление.ToObject[^] вместо.

var realType = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType;
var convertedValue = realType.IsEnum && val != null ? Enum.ToObject(realType, val) : val;
prop.SetValue(item, convertedValue, null);


Рейтинг:
0

F-ES Sitecore

Используйте обозначение"?", чтобы сделать ненулевой тип nullable

public enum Types : int
{
    Good = 1,
    Medium = 2,
    Critical = 3,
}

public class MyData
{
    public Types? Types { get; set; }
}


Использование

var myData = new MyData();

myData.Types = null;

System.Diagnostics.Debug.WriteLine(myData.Types);

// to check if it is not null;
bool hasTypes = myData.Types.HasValue;

// or
hasTypes = myData.Types != null;

myData.Types = Types.Critical;

System.Diagnostics.Debug.WriteLine(myData.Types);


если это сработает для вас, это может зависеть от того, как вы десериализуете свои данные и как они выглядят.