Domanda

Ho un pezzo di codice smontato che non ha funzionato abbastanza bene con un codice di riflessione.Non ho idea di come renderlo valido in quanto non so come lavorare con MethodHandles ecc ... Penso che dovrebbe essere un compito abbastanza semplice per un guru della riflessione perché (per quanto posso dedurre) l'unica cosache deve accadere è "ottenere un handle di metodo da un'interfaccia"?Ho ragione?

Il seguente parametro è sbagliato .. IProductRepositoryItem.Code dovrebbe essere un RuntimeMethodHandle

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

Codice 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);
È stato utile?

Soluzione

Supponendo che la tua funzione non abbia parametri, dovresti cambiare l'intera linea offensiva in questa:

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

Se accetta parametri, utilizza l'overload appropriato di GetMethod.

MODIFICA : se stai tentando di accedere a una proprietà, dovresti utilizzare l'overload di Expression.Property che accetta un PropertyInfo anziché un MethodInfo.

typeof(IProductRepositoryItem).GetProperty("Code");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top