2017-01-10 1 views
1

Я работаю над требованием, когда мне нужно проверить свое свойство модели ASP.NET для значения 000000.Если значение 000000, то оно должно отображаться как пустая строка. Я думал об этом, используя неявные операторы. Вот моя модель классаC# Неявный оператор не работает с отражением

public class OrgName 
     { 
      private string Value { get; set; } 

      public static implicit operator string(OrgName org) 
      { 
       return org.Value; 
      } 

      public static implicit operator OrgName(string value) 
      { 
       bool isAllZeros = value.Where(x => char.IsDigit(x)).All(x => x == '0'); 
       if (isAllZeros) 
        value = string.Empty; 
       return new OrgName() { Value = value }; 
      } 

     } 

Проблема заключается в том, что мы с помощью отражения, чтобы установить свойство values.The выше код не работает, и свойство всегда отображается как пустой.

Вот код отражения

var prName = (String.IsNullOrWhiteSpace(parentPrefix) ? objKey : parentPrefix + '.' + objKey); 
        var pi = modelMap[prName.ToLowerInvariant()].Property; 

       var value = (collectionProperties.ContainsKey(objKey)) ? collectionProperties[objKey] : pi.GetValue(parentObj); 

       if (value == null || pi.PropertyType.IsSimpleType()) 
       { 
        value = (prName == fieldToSet && pi.PropertyType.IsSimpleType()) 
         ? (Convert.IsDBNull(valueToSet)) ? null : valueToSet 
         : createObject(pi.PropertyType); 

        var type = Nullable.GetUnderlyingType(pi.PropertyType); 

        //check to see if we need to convert the type when assigning 

        if (type == typeof(Guid)) 
         value = Guid.Parse(value.ToString()); 

        pi.SetValue(parentObj, type != null ? Convert.ChangeType(value, type) : value); 

        if (pi.PropertyType != typeof(string) && IsContainerProperty(pi.PropertyType)) 
         continue; 
        if (pi.PropertyType == typeToReturn) 
         objToLoad = value; 

       } 
       else if (!collectionProperties.ContainsKey(objKey) && IsContainerProperty(pi.PropertyType)) 
       { 
        var innerType = pi.PropertyType.GetGenericArguments()[0]; 
        var add = pi.PropertyType.GetMethod("Add", 
          BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public); 


        if (innerType.IsSimpleType()) 
        { 
         collectionProperties[objKey] = valueToSet; 
         add.Invoke(value, new[] { valueToSet }); 

        } 
        else 
        { 
         // Since we can't access the property 
         var innerObj = createObject(innerType); 
         collectionProperties[objKey] = innerObj; 
         add.Invoke(value, new[] { innerObj }); 
         if (innerType == typeToReturn) 
          objToLoad = innerObj; 
         continue; 
        } 
       } 

Может кто-то помочь мне с этим? Я также открыт для других предложений для достижения этой цели.

Thanks

+0

Я не вижу никакого отражения здесь. Можете ли вы добавить этот код? –

+1

Ваш код имеет недостаток кстати. Строка 'a0000a0b0' будет обнаружена как' isAllZeros'. – Bauss

+0

Я не понимаю, почему этот вопрос ниспровергнут. Я имею в виду, Приянк сделал некоторые исследования, предоставил код и так далее. Цели также четко описаны, хотя код и вопрос немного противоречат друг другу, но я не понимаю, почему это послужило бы причиной для понижения. – Heki

ответ

1

Вы могли бы просто поместить код в сеттер?

public class OrgName 
{ 
    private string _value; 
    private string Value 
    { 
     get { return _value; } 
     set 
     { 
      bool isAllZeros = value?.All(x => x == '0') ?? false; 
      if(isAllZeros) 
      { 
       _value = string.Empty; 
      } 
      else 
      { 
       _value = value; 
      } 
     } 
    } 

} 
+1

Или, может быть, даже в геттере. –

+1

Если цель состоит в том, чтобы найти значение «значение» - это все нули, это также сделало бы трюк : 'set {_value = value.Trim (" 0 "). Длина> 0? значение: string.Empty;}' – Heki

+0

@Heki да, цель состоит в том, чтобы проверить, все ли значения, нуль, то это должно быть отображено как пустое string. –

1

Это может быть косвенное решение проблемы, так как прямо сейчас ваш код имеет недостатки.

Ex. a0000a0b0 будет определяться как isAllZeros

Чтобы подробнее разъяснить, в чем проблема в вашем коде.

Прежде всего, давайте посмотрим на эту строку:

bool isAllZeros = value.Where(x => char.IsDigit(x)).All(x => x == '0'); 

Первое, что вы делаете принимает value и выполняя Where на нем. Условие прохождения where состоит в том, что каждое значение (x) представляет собой цифру. Это означает, что любые нецифровые символы, такие как a, b, c будут пропущены.

Как противоречит тому, что вы, возможно, интерпретировали Where, так как оно просто отфильтровывает любые значения, которые не соответствуют условию.

Это означает, что значения, которые не являются цифрами в вашем случае, не будут проходить, и, таким образом, когда перечисление достигнет All, тогда оно будет перечислять только цифры, которые являются цифрами.

Что ваш код в основном эквивалентна в англоговорящей является:

  1. значение Take
  2. Пропустить все символы, не являющиеся цифрами
  3. Проверьте все цифры символы 0 '

Что вы хотите, чтобы ваш код действительно делал:

  1. Возьмите значение
  2. Проверьте, не являются ли все символы цифрами и 0. В этом случае вам действительно нужно проверить, есть ли символ '0'. Проверка char.IsDigit избыточна.

Это можно было бы решить, делая это:

bool isAllZeros = value.All(x => x == '0'); 

Вы можете поместить в нулевой проверки в случае value равна нулю, хотя.

bool isAllZeros = value?.All(x => x == '0') ?? false; 

В случае, если вы не используете C# 6

bool isAllZeros = string.IsNullOrEmpty(value) ? false : value.All(x => x == '0'); 
+0

Спасибо за указание ошибки. Большое спасибо! –