2012-09-22 12 views
25

Recibo esta advertencia de ReSharper: Acceso a la variable foreach en el cierre. Puede tener un comportamiento diferente cuando se compila con diferentes versiones del compilador.¿Cómo puedo solucionarlo: acceso a la variable foreach en la advertencia de reafilado de cierre?

Esto es lo que estoy haciendo:

@foreach(var item in Model) 
{ 
    // Warning underlines "item". 
    <div>@Html.DisplayBooleanFor(modelItem => item.BooleanField)</div> 
} 

Mi extensión es de la siguiente manera:

public static MvcHtmlString DisplayBooleanFor<TModel, TValue>(
    this HtmlHelper<TModel> helper, 
    Expression<Func<TModel, TValue>> expression) 
{ 
    bool value; 

    try 
    { 
     var compiled = expression.Compile()(helper.ViewData.Model); 
     value = Convert.ToBoolean(compiled); 
    } 
    catch (Exception) 
    { 
     value = false; 
    } 

    return MvcHtmlString.Create(value ? "Yes" : "No"); 
} 

Nota esto está funcionando como se esperaba, pero ¿cómo puedo evitar esta advertencia?
Agradeceré cualquier ayuda brindada.

+2

¿Por qué está utilizando 'Expression <>' si todo lo que hace con él es llamar a '.Compile()' en él? ¿Por qué no usar 'Func <>' directamente? – hvd

+0

¿Por qué estás pasando una Expresión en vez de solo un bool? –

+0

@ ChaosPandion: es útil para mí ya que no necesito usar un si en mi opinión. – Esteban

Respuesta

25

Una variable de ámbito de bloque debería resolver la advertencia.

@foreach(var item in Model) 
{ 
    var myItem = item; 
    <div>@Html.DisplayBooleanFor(modelItem => myItem.BooleanField)</div> 
} 
+0

Gracias, corrigió la advertencia, alguna idea de por qué sucede esto ? – Esteban

+10

@Esteban hay más en la wiki de JetBrains [aquí] (http://confluence.jetbrains.net/display/ReSharper/Access+to+modified+closure) (que dependiendo de su versión de R # se puede vincular directamente desde el menú de bombilla como '¿Por qué ReSharper sugiere esto?); ver también [esta pregunta SO] (http://stackoverflow.com/questions/235455/access-to-modified-closure?rq=1) – AakashM

+2

@Esteban Esa es la mejor explicación que encontré hasta ahora: http: // stackoverflow. com/questions/14907987/access-to-foreach-variable-in-closure – ForceMagic

2

Otra opción es aplicar JetBrains.Annotations.InstantHandleAttribute atributo a DisplayBooleanFor método.

Cuestiones relacionadas