c# - programa analizador de parentesis, llaves y corchetes "(){}[] " c++
Explica 2 pares de paréntesis en expresión.Compilar()() (2)
¿Podría por favor explicar qué hace este extraño código?
expression.Compile()();
¿Por qué hay 2 pares de paréntesis aquí? No encontré nada en google. El método completo es
public Validator NotEmpty(Expression<Func<IEnumerable<T>>> expression)
{
var member = (MemberExpression)expression.Body;
string propertyName = member.Member.Name;
IEnumerable<T> value = expression.Compile()();
if (value == null || !value.Any())
{
ValidationResult.AddError(propertyName, "Shouldn''t be empty");
}
return this;
}
Se usa así:
_validator.NotEmpty(() => request.PersonIds); // request.PersonIds is List<int>
Este método comprueba si una colección está vacía o nula. Todo funciona bien, pero estoy un poco confundido con ese código. Nunca he visto usar 2 pares de paréntesis antes en C #. Qué significa eso?
Bueno, pasas la lista de int en el método como árbol de expresiones. Esta expresión produce el valor de IEnumerable<T>
(en este caso IEnumerable<int>
).
Para obtener el valor de la expresión, debe compilar esta expresión en un delegado Func<IEnumerable<T>>
y luego invocar al delegado. De hecho, puedo escribir dos líneas de código separadas en lugar de la sintaxis más corta utilizada anteriormente:
Func<IEnumerable<T>> del = expression.Compile();
IEnumerable<T> value = del();
Los dos corchetes () son en realidad un operador que invoca un método o un delegado. Ver here
La expresión "expresión.Compilar ()" parece entregar un delegado que se puede invocar. El segundo par de paréntesis invoca a este delegado.
También podrías reescribir esto como:
var del = expression.Compile();
del();