¿Obtener RuntimeMethodHandle de la interfaz?
-
27-10-2019 - |
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);
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");