Digamos que tengo una clase modelo que se ve así:
public class ModelTest { public string val1 {get;set;} public string val2 {get;set;} public string val3 {get;set;} }En algún lugar de mi código, este ModelTest obtiene sus datos. La advertencia es que, solo 1 de ellos tendrá un valor
var model = new ModelTest() {val1=null, val2="value", val3=null} //Sudo codeLo que estoy tratando de hacer de alguna manera es comparar un valor con cualquiera de los 3 elementos que puedan tener valores, por lo que algo como:
var testCompare = "someValue" if (testCompare == model. ....//how can I get the NOT NULL value from ModelTest here for comparisonSi bien su modelo de datos no es ideal, es posible verificar cada una de las propiedades utilizando el || operador para comparar cada valor. Siempre que su variable testCompare no contenga valores nulos, también puede omitir una comprobación de valores nulos.
if (model.val1 == testCompare || model.val2 == testCompare || model.val3 == testCompare) { } Como se menciona en los comentarios, si desea una versión más sucinta, puede usar el operador de fusión nula, ?? , para verificar las propiedades posteriores si su propiedad anterior devuelve nulo. Al final de la cadena de fusión nula, la primera propiedad no nula se comparará con su cadena testCompare . Tenga en cuenta que debe envolver las tres propiedades entre paréntesis y que esto tiene un comportamiento diferente; solo prueba la primera propiedad no nula, mientras que la versión anterior prueba TODAS las propiedades para una coincidencia.
if (testCompare == (model.val1 ?? model.val2 ?? model.val3)) { }Probablemente podría crear un método (o incluso una propiedad) como:
public string Val() { if (val1 != null) return val1; if (val2 != null) return val2; if (val3 != null) return val3; return null; }Probablemente haya una forma más corta de escribir este código. Además, si dos o más de los valores no son nulos, devolverá el primero.
Puede agregar una propiedad a su clase ModelTest que proporcione el primer valor no nulo (si lo hay) en su objeto:
public class ModelTest { public string val1 { get; set; } public string val2 { get; set; } public string val3 { get; set; } public string val => val1 ?? val2 ?? val3; }y luego verifique contra eso:
if (model.val == testCompare) { }¿Qué pasa con la solución que contiene una combinación de reflexión y Linq,
Datos de prueba
var model = new ModelTest() {val1=null, val2="value", val3=null} ;Uso
var result = model.GetType() .GetProperties() .FirstOrDefault(prop => prop.GetValue(model, null) != null);Imprimir resultado
Console.WriteLine(result.GetValue(model));Este es mi primer intento con la reflexión, las sugerencias son muy bienvenidas.
Nota: Esta es solo una solución alternativa , menos eficaz . Si está buscando una solución elegante, pruebe otras soluciones.
Es un caso de uso muy extraño, pero vamos con él. Aquí otra opción para la fogata..
public class ModelTest { private string _val; public string val1 {get => _val; set => _val ??= value;} public string val2 {get => _val; set => _val ??= value;} public string val3 {get => _val; set => _val ??= value;} } Cualquiera de estos que se establece en no nulo termina asignando ese valor a _val - ??= escribe la mano derecha en la mano izquierda solo si la mano izquierda es nula, esencialmente como left = left ?? right
No importa cuál use para acceder al valor.
Tenga en cuenta que solo hay una ubicación de almacenamiento de datos, por lo que este enfoque no puede recordar dos valores, o qué valor no era nulo. No usaría esto para propiedades dispares como nombre, dirección y número de seguro social porque podría tener efectos extraños en otros lugares. Esto es para un caso de uso muy limitado de "hay tres propiedades que son esencialmente lo mismo, no se pueden colapsar en una, y no sé cuál se establecerá, pero puedo tratarlas de forma equivalente para leer".
Puede anular el método 'Equals' de la clase ModelTest como desee. Ejemplo:
public class ModelTest { public string val1 {get;set;} public string val2 {get;set;} public string val3 {get;set;} public override bool Equals(object obj) { if(!typeof(string).IsInstanceOfType(obj)) return base.Equals(obj); string value = obj as string; if (val1.Equals(value)) return true; if (val2.Equals(value)) return true; if (val3.Equals(value)) return true; return false; } }Para usar el método:
if(model.Equals("yourValue")) ...