2015-02-27 2 views
-2

Я пытаюсь найти, как заставить это работать с различными типами. Заранее благодарим за помощь!Проблема преобразования выражения LINQ

public static void Main() 
{ 
    GetKeySelector("String01");  // OK 
    GetKeySelector("Date01");  // ArgumentException: Expression of type 'System.Nullable`1[System.DateTime]' cannot be used for return type 'System.String' 
    GetKeySelector("Integer01"); // ArgumentException: Expression of type 'System.Int32' cannot be used for return type 'System.String' 
} 


private static Expression<Func<Project,string>> GetKeySelector(string propertyName) 

{  
    var paramExpr = Expression.Parameter(typeof (Project), "p"); 
    var property = Expression.Property(paramExpr, propertyName); 
    var finalLambda = Expression.Lambda<Func<Project, string>>(property, paramExpr); 
    return finalLambda; 
} 

class Project 
{ 
    public DateTime? Date01 {get;set;} 
    public int Integer01 {get;set;}  
    public string String01 {get;set;} 
} 
+0

Что вы подразумеваете под разными типами? Как взять в родовом, а не в «Проект»? – ryanyuyu

+0

Ну, ваша func возвращает строку, но вы пытаетесь вернуть DateTime или целое число. Какое желаемое поведение? Вы хотите преобразовать возвращаемое свойство в строку перед рукой? –

ответ

0

Проблема заключается в том, что вы пытаетесь использовать свойство отличных string типов в выражении, которое производит string. Это не допускается без преобразования.

Одним из способов решения этой проблемы было бы изменить код, чтобы произвести object сек вместо string с, как это:

private static Expression<Func<Project,object>> GetKeySelector(string propertyName) {  
    var paramExpr = Expression.Parameter(typeof (Project), "p"); 
    var property = Expression.Property(paramExpr, propertyName); 
    var cast = Expression.Convert(property, typeof(object)); 
    return Expression.Lambda<Func<Project,object>>(cast, paramExpr); 
} 

В качестве альтернативы можно было бы назвать Convert.ToString через выражение.

+0

как вариант call 'Convert.ToString' или что-то вроде – Grundy

Смежные вопросы