Pregunta

Tengo un fragmento de código desensamblado que no funcionó del todo bien con algún código de reflexión.No tengo idea de cómo hacerlo válido ya que no sé cómo trabajar con MethodHandles, etc. Creo que debería ser una tarea bastante simple para un gurú de la reflexión porque (hasta donde puedo deducir) lo únicolo que debe suceder es 'obtener un identificador de método desde una interfaz'?¿Estoy en lo correcto?

El siguiente parámetro es incorrecto ... IProductRepositoryItem.Code debe ser un RuntimeMethodHandle

(MethodInfo) MethodBase.GetMethodFromHandle(IProductRepositoryItem.Code));

Código completo:

ParameterExpression parameterExpression = Expression.Parameter(typeof (T), "i");
// ISSUE: method reference

Expression<Func<T, object>> property =
    Expression.Lambda<Func<T, object>>(
        (Expression) Expression.Property(
            (Expression) Expression.Convert((Expression) parameterExpression, typeof (IProductRepositoryItem)),
            (MethodInfo) MethodBase.GetMethodFromHandle(IProductRepositoryItem.Code)), 
                new ParameterExpression[1] {
                     parameterExpression
                });
string key = entityHelper.GetField<T>(property);
¿Fue útil?

Solución

Suponiendo que su función no tiene parámetros, debe cambiar toda la línea ofensiva a esto:

typeof(IProductRepositoryItem).GetMethod("Code");

Si necesita parámetros, use la sobrecarga adecuada de GetMethod.

EDITAR : si está intentando acceder a una propiedad, debe utilizar la sobrecarga de Expression.Property que toma un PropertyInfo en lugar de un MethodInfo.

typeof(IProductRepositoryItem).GetProperty("Code");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top