Ottenere RuntimeMethodHandle dall'interfaccia?
-
27-10-2019 - |
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);
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");