Ottenere RuntimeMethodHandle dall'interfaccia?

c# c#-3.0 expression-trees methodhandle

Domanda

Ho un pezzo di codice smontato che non ha funzionato abbastanza bene intorno al 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 piuttosto semplice per un guru della riflessione perché (per quanto posso dedurre) l'unica cosa quello che deve succedere è 'ottenere un metodo di gestione da un'interfaccia'? Ho ragione?

Il seguente parametro non è corretto. 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);

Risposta accettata

Supponendo che la tua funzione non abbia parametri, dovresti cambiare l'intera riga incriminata con questo:

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

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

MODIFICA : se si sta tentando di accedere a una proprietà, è necessario utilizzare il sovraccarico di Expression.Property che richiede un PropertyInfo anziché un MethodInfo .

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


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché