Как проверить, есть ли между двумя экземплярами одного и того же класса тот же член, что и у NULL - PullRequest
0 голосов
/ 01 марта 2020

У меня есть класс, который я использую для определения типов, подобных этому

public class TypeSpec 
{
  // String specifications
  public int? maxLength {get; set;} = null;
  public int? minLength {get; set;} = null;

  // int specifications
  public int? maxInteger {get; set;} = null;
  public int? minInteger {get; set;} = null;
}

TypeSpec typeInitialString = new TypeSpec() 
{
  maxLength = 10;
  minLength = 0;
}

TypeSpec typeUpdatedString = new TypeSpec() 
{
  maxLength = 10;
  minLength = 5;
  maxInteger = 0;
}

Как проверить, имеет ли TypeSecond MaxInteger по-прежнему в качестве null, и вызвать false, гарантируя, что значения изменяются здесь только maxLength и MinLength от 0-10 до 5-10?

Я хочу изменить исходные критерии типа, которые я установил с помощью typeInitialString с помощью typeUpdatedString .., но перед этим мне нужно проверить, действительно ли спецификация не содержит спецификации для других типов, таких как целое число? поскольку typeInitialString используется только для строк, и ничто иное

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

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Также не совсем ясно по этому вопросу. Простая версия для возврата false на typeB.maxInteger, являющаяся null, будет выглядеть примерно так: var result = typeB.maxInteger.HasValue ? true : false;

Кажется, что вы пытаетесь реализовать некоторые пользовательские проверки на равенство объектов, поэтому вам нужно посмотреть при реализации IEquatable и связанных с ним перегрузках:

public class TypeSpec : IEquatable<TypeSpec>
{
    public int? maxLength { get; set; } = null;
    public int? minLength { get; set; } = null;

    public int? maxInteger { get; set; } = null;
    public int? minInteger { get; set; } = null;

    public static bool operator ==(TypeSpec a, TypeSpec b)
        => a.Equals(b);

    public static bool operator !=(TypeSpec a, TypeSpec b)
        => !a.Equals(b);

    public bool Equals(TypeSpec other)
    {
        var result = GetHashCode() == other.GetHashCode();
        return result;
    }

    public override bool Equals(object obj)
    {
        return this == obj as TypeSpec;
    }

    public override int GetHashCode()
    {
        var maxI = maxInteger.HasValue ? maxInteger.Value : default;
        var minI = minInteger.HasValue ? minInteger.Value : default;
        var minL = minLength.HasValue ? minLength.Value : default;
        var maxL = maxLength.HasValue ? maxLength.Value : default;

        var result = (maxI + minI + minL + maxL).GetHashCode();
        return result;
    }
}

public class Program
{
    public static void Main()
    {

        TypeSpec typeA = new TypeSpec()
        {
            maxLength = 10,
            minLength = 0
        };

        TypeSpec typeB = new TypeSpec()
        {
            maxLength = 10,
            minLength = 0,
            maxInteger = null
        };

        var result = typeB == typeA;

    }
}
0 голосов
/ 01 марта 2020

Полагаю, вы хотите сравнить значение свойств типа A и typeB. Есть несколько способов. Самое простое - это сравнение каждого свойства. Если typeA.MaxInt равен нулю, а typeB.MaxInt равен нулю, typeA.MaxInt == typeB.MaxInt даст вам значение true.

...