2010-10-04 12 views
8

Próbuję napisać wyrażenie, które wywoła ToString na właściwości i przypisać jej wartość do zmiennej lokalnej. Jednak wywołanie ToString na instancji obiektu z przeciążeniem ToString powoduje wyrzucenie wyjątku "Ambigous Match Found". Oto przykład:Expression.Call i "Niejednoznaczne dopasowanie znalezione"

var result = Expression.Variable(typeof(string), "result"); 
var matchTypeParameter = Expression.Parameter(typeof(MatchType), "matchType"); 
var targetProperty = Expression.Property(leadParameter, target); 

var exp = Expression.Block(
    //Add the local current value variable 
    new[] { result }, 

    //Get the target value 
    Expression.Assign(result, Expression.Call(targetProperty, typeof(string).GetMethod("ToString"), null)) 

); 

Jak mogę wywołać ToString, jeśli instancja ma dla niego przeciążenie? Dzięki!

Odpowiedz

13

Wymienić:

typeof(string).GetMethod("ToString") 

Z:

typeof(string).GetMethod("ToString", Type.EmptyTypes) 

Innymi słowy, dostać metodę o nazwie "ToString", który trwa zerowe argumenty (pusty typ tablicy).

+1

To było dokładnie to, czego szukałem, dzięki! Nigdy wcześniej nie słyszałem o Type.EmptyTypes. Czy istnieje książka refleksyjna, która omawia takie rzeczy, które polecacie? –

+0

Type.EmptyTypes jest skrótem (i nieco bardziej wydajnym niż) 'new Type [0]'. Przepraszam, nie jestem księgowym, ale nauczysz się * lot * po prostu analizując kod źródłowy do "MethodInfo", "FieldInfo" i "Type" (oprócz wszystkich metod w wyrażeniu "Wyrażenie"). –

+0

Dzięki. Uratujesz mój dzień –

Powiązane problemy