Ламбда изразът на свойството получава допълнително Convert(p=›p.Property)

Имам проблем, когато в някои случаи (изглежда, когато типът на свойство е bool) ламбда израз, използван за препращане към свойство. Използвам това, за да получа името му; проблемът е, че понякога изразът се модифицира, за да има допълнителна функция Convert().

e.g.

GetPropertyName<TSource>(Expression<Func<TSource, object>> propertyLambda) {...}

var str = GetPropertyName<MyObject>(o=>o.MyBooleanProperty);

Какво се случва, че свойството Lambda изглежда като Convert(o.MyBooleanProperty), а не като o.MyBooleanProperty, което бих очаквал.


person sambomartin    schedule 25.06.2012    source източник
comment
Съжалявам, какъв точно е въпросът? Откъде идва функцията Convert?   -  person Philip Daubmeier    schedule 26.06.2012
comment
Можем ли да видим кода за внедряване на GetPropertyName   -  person fenix2222    schedule 26.06.2012
comment
Моля, вижте Stack Overflow не позволява етикети в заглавия.   -  person John Saunders    schedule 26.06.2012
comment
добре благодаря Джон. но част от въпроса беше някакви идеи [защо това се случва]? - както спомена Филип, прилича повече на изказване без въпрос накрая. но оценявам усилията ви.   -  person sambomartin    schedule 26.06.2012


Отговори (1)


Convert се добавя, защото o.MyBooleanProperty е bool, но резултатът трябва да бъде обект. Ако сте направили метода си общ както в типа обект източник, така и в типа резултат, тогава няма да има Convert:

GetPropertyName<TSource, TResult>(Expression<Func<TSource, TResult>> propertyLambda)

За съжаление това означава, че трябва изрично да посочите TResult:

GetPropertyName<MyObject, bool>(o => o.MyBooleanProperty)

Ако не искате да направите това, ще трябва да намерите някакъв начин да изведете MyObject или да избегнете нуждата от него.

Например, ако текущият обект е MyObject (и сте в метод на екземпляр), можете да промените кода си, за да вземе Func<TResult>:

GetPropertyName(() => this.MyBooleanProperty)

Или можете да включите друг параметър от тип TSource, който ще ви помогне да заключите типа:

GetPropertyName(myObject, o => o.MyBooleanProperty)
person svick    schedule 26.06.2012
comment
благодаря много @svick - предвид последния ви пример GetPropertyName(myObject, o => o.MyBooleanProperty) - как би изглеждала декларацията на функцията, очевидно ще трябва да добавя обектен параметър? също така, възможно ли е да се създаде разширение, което предоставя метод за разширение GetPropertyName въз основа на този GetPropertyName(() => this.MyBooleanProperty) пример? - person sambomartin; 26.06.2012
comment
Декларацията за последната опция би изглеждала нещо като GetPropertyName<TSource, TResult>(TSource obj, Expression<Func<TSource, TResult>> propertyLambda). И не съм сигурен какво имате предвид под метода на разширение, в тази опция нямате нужда от екземпляр, може да бъде нормален статичен метод. - person svick; 26.06.2012