uso usar unario ternario operator operadores operador entonces como asignacion c# null-conditional-operator

usar - operadores de asignacion en c#



Uso del operador condicional nulo en el lado izquierdo de una asignaciĆ³n (6)

Bastante tarde para la fiesta, pero llegué a este artículo con un problema similar. Tomé la idea del método SetValue y creé un método de extensión genérico, como se muestra a continuación:

/// <summary> /// Similar to save navigation operator, but for assignment. Useful for += and -= event handlers. /// If <paramref name="obj"/> is null, then <paramref name="action"/> is not performed and false is returned. /// If <paramref name="obj"/> is not null, then <paramref name="action"/> is performed and true is returned. /// </summary> public static bool SafeAssign<T>(this T obj , Action<T> action ) where T : class { if (obj is null) return false; action.Invoke(obj); return true; }

Ejemplo de uso, para adjuntar y separar un controlador de eventos:

public void Attach() => _control.SafeAssign(c => c.MouseDown += Drag); public void Detach() => _control.SafeAssign(c => c.MouseDown-= Drag);

Espero que alguien lo encuentre útil :)

Tengo unas cuantas páginas, cada una con una propiedad llamada Data . En otra página estoy configurando estos datos de esta manera:

if (MyPage1 != null) MyPage1.Data = this.data; if (MyPage2 != null) MyPage2.Data = this.data; if (MyPage3 != null) MyPage3.Data = this.data;

¿Hay alguna posibilidad de usar el operador condicional nulo en MyPage ? Estoy pensando en algo como esto:

MyPage?.Data = this.data;

Pero cuando lo escribo así, me sale el siguiente error:

El lado izquierdo de una asignación debe ser una variable, una propiedad o un indexador.

Sé que es porque MyPage podría ser nula y el lado izquierdo ya no sería una variable.

No es que no pueda usarlo como ya lo tengo, pero solo quiero saber si hay alguna posibilidad de usar el operador condicional nulo en esto.


Como Joachim Isaksson sugirió en los comentarios, ahora tengo un método SetData(Data data) y lo uso así:

MyPage1?.SetData(this.data); MyPage2?.SetData(this.data); MyPage3?.SetData(this.data);


El operador de propagación nula devuelve un valor. Y como debe tener una variable en el lado izquierdo de una asignación, y no un valor, no puede usarla de esta manera.

Claro, podrías hacer las cosas más cortas usando el operador de tenario, pero eso, por otro lado, no ayuda realmente al aspecto de legibilidad.

El comentario de Joachim Isaksson sobre su pregunta muestra un enfoque diferente que debería funcionar.


Prueba esto Agrega todas tus páginas a myPageList.

IEnumerable<MyPage> myPageList; foreach(MyPage myPage in myPageList) { if (myPage != null) myPage.Data = this.data; }


Se me ocurrió la siguiente extensión,

public static class ObjectExtensions { public static void SetValue<TValue>(this object @object, string propertyName, TValue value) { var property = @object.GetType().GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance); if (property?.CanWrite == true) property.SetValue(@object, value, null); } }

Que puede ser llamado globalmente; Esto solo funciona en propiedades públicas.

myObject?.SetValue("MyProperty", new SomeObject());

La siguiente versión mejorada funciona en cualquier cosa,

public static void SetValue<TObject>(this TObject @object, Action<TObject> assignment) { assignment(@object); }

Y también puede ser llamado globalmente,

myObject?.SetValue(i => i.MyProperty = new SomeObject());

Pero el nombre de la extensión es algo engañoso, ya que la Action no requiere exclusivamente una asignación.


Un método genérico de extensión SetValue (pero solo para las propiedades ref) sería:

public static void SetValue<T>(this T property, T value) { property = value; }

Y será utilizado como

ButtonOrNull?.Visibility.SetValue(Visibility.Hidden);