Arıyordum ama tipine tip<Func <T, object>>
Expression<Func<T, DateTime>>
yayın yapmayı nasıl bulamıyor:
Expression<Func<T, object>>
Bu yüzden, SO'nın engin bilgilerine geri dönmeliyim;)
Arıyordum ama tipine tip<Func <T, object>>
Expression<Func<T, DateTime>>
yayın yapmayı nasıl bulamıyor:
Expression<Func<T, object>>
Bu yüzden, SO'nın engin bilgilerine geri dönmeliyim;)
Aynı türden olmadıklarından, bunlar arasında yalnızca geçiş yapamazsınız. Ancak, etkili ifade ağacındaki bir dönüşüm ekleyebilirsiniz: Jon kod (btw teşekkürler) dayanarak
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);
}
}
tamamladıktan esneklik için bir adım daha ileri sürebilir:
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);
}
Bunun için herhangi bir kullanım örneği var mı? –
cevapları Rob ve Jon Skeet bir sorun var.
Sen x => Convert(x.PropertyName)
gibi bir şey olsun, ama çoğu zaman ASP.NET MVC için örneğin bu x => x.PropertyName
gibi bir ifade Yani Expression.Convert
bazı durumlarda "kirletici" ifadesi olduğunu istiyorum.
Çözüm:
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);
}
}
Kullanım:
Expression<Func<T, DateTime>> expression = ...;
Expression<Func<T, object>> expr = expression.ToUntypedPropertyExpression();
Bu işe yaramıyor. Örneğin, Int32’yi 'object'’e dönüştürebilirim; "Dönüştür" çağrısının anlamı budur. Onsuz bir “ArgumentException” alıyorum. 'DateTime' sürümünü denemek, aynı şey. Bu sizin için işe yararsa, bir referans türü ile yaptığınızı tahmin ediyorum. –
Sadece tüm veri tipleri için çalışır, nesne olarak TResult tanımlar ve ifade derlenmesi;
Expression<Func<string, object>> dateExp = text => DateTime.Now;
object dt = dateExp.Compile()("hi");
Console.WriteLine(dt);
@JonSkeet Expression.Convert her zaman iyi bir fikir değildir. Cevabımı gör. – Rookian