반응형
Expression 캐스팅 방법> 식>
검색 중이지만 유형에서 캐스트하는 방법을 찾을 수 없습니다.
Expression<Func<T, DateTime>>
유형 :
Expression<Func<T, object>>
그래서 나는 너무 방대한 지식으로 다시 돌아 가야한다;)
그들은 같은 종류가 아니기 때문에 그들 사이에 캐스팅 할 수 없습니다. 그러나 표현식 트리 내에서 효과적으로 변환을 추가 할 수 있습니다.
using System;
using System.Linq.Expressions;
class Test
{
// This is the method you want, I think
static Expression<Func<TInput,object>> AddBox<TInput, TOutput>
(Expression<Func<TInput, TOutput>> expression)
{
// Add the boxing operation, but get a weakly typed expression
Expression converted = Expression.Convert
(expression.Body, typeof(object));
// Use Expression.Lambda to get back to strong typing
return Expression.Lambda<Func<TInput,object>>
(converted, expression.Parameters);
}
// Just a simple demo
static void Main()
{
Expression<Func<string, DateTime>> x = text => DateTime.Now;
var y = AddBox(x);
object dt = y.Compile()("hi");
Console.WriteLine(dt);
}
}
Rob 과 Jon Skeet 의 답변 에는 한 가지 문제가 있습니다.
와 같은 것을 얻지 x => Convert(x.PropertyName)
만 ASP.NET MVC의 경우 종종 다음과 같은 식을 원합니다.x => x.PropertyName
그래서 Expression.Convert
이다 "오염" 경우의 식입니다.
해결책:
public static class LambdaExpressionExtensions
{
public static Expression<Func<TInput, object>> ToUntypedPropertyExpression<TInput, TOutput> (this Expression<Func<TInput, TOutput>> expression)
{
var memberName = ((MemberExpression)expression.Body).Member.Name;
var param = Expression.Parameter(typeof(TInput));
var field = Expression.Property(param, memberName);
return Expression.Lambda<Func<TInput, object>>(field, param);
}
}
용법:
Expression<Func<T, DateTime>> expression = ...;
Expression<Func<T, object>> expr = expression.ToUntypedPropertyExpression();
Jon의 코드 (btw 감사합니다)를 기반으로 한 단계 더 나아가 완전한 유연성을 얻을 수 있습니다.
public static Expression<Func<TModel, TToProperty>> Cast<TModel, TFromProperty, TToProperty>(Expression<Func<TModel, TFromProperty>> expression)
{
Expression converted = Expression.Convert(expression.Body, typeof(TToProperty));
return Expression.Lambda<Func<TModel, TToProperty>>(converted, expression.Parameters);
}
Just define the out TResult as object and compile the expression, it works for all data types;
Expression<Func<string, object>> dateExp = text => DateTime.Now;
object dt = dateExp.Compile()("hi");
Console.WriteLine(dt);
ReferenceURL : https://stackoverflow.com/questions/729295/how-to-cast-expressionfunct-datetime-to-expressionfunct-object
반응형
'Nice programing' 카테고리의 다른 글
Android는 JDK 6 또는 7을 지원합니까? (0) | 2020.12.30 |
---|---|
Typescript에서 JSON 문자열을 구문 분석하는 방법 (0) | 2020.12.29 |
CSS에서 테이블 패딩을 어떻게 지정합니까? (0) | 2020.12.29 |
교리 2에서 WHERE .. IN 하위 쿼리 수행 (0) | 2020.12.29 |
단일 POM에서 두 개의 다른 maven exec-maven-plugin을 실행할 수 있습니까? (0) | 2020.12.29 |