【问题标题】:Convert Expression<Func<TEntity,TKey> to Expression<Func<TEntity, Object>>将 Expression<Func<TEntity,TKey> 转换为 Expression<Func<TEntity, Object>>
【发布时间】:2017-09-04 16:35:29
【问题描述】:

我希望将Expression&lt;Func&lt;TEntity,TKey&gt; 转换为Expression&lt;Func&lt;TEntity, Object&gt;&gt;

因为一切都是对象,所以我尝试了这样的隐式转换:

var propertyMetadata = 
    new PropertyMetadata<TEntity>((Expression<Func<TEntity, object>>)expression);

但这会产生错误:

无法将类型 Expression&lt;Func&lt;TEntity,TKey&gt; 转换为 Expression&lt;Func&lt;TEntity, Object&gt;&gt;

有没有一种简单的方法可以在这两种类型之间进行转换

【问题讨论】:

  • 这涉及到创建一个全新的表达式,如果TKey 可以是一个值类型,那就有点复杂了。但如果可能的话,我会说PropertyMetadata 应该有一种方法允许从Expression&lt;Func&lt;TEntity, TKey&gt;&gt; 构造。这是你自己的课吗?如果有,是否开放修改?
  • @hvd 它不能接受 tkey 类型,因为它是类型中可搜索属性的白名单。所以有多种类型的tkey。当我手写它时,它会自动在我的表情中创建一个音乐会
  • 我明白这一点。但是您可以拥有一个私有构造函数,该构造函数采用由通用PropertyMetadata&lt;TEntity&gt;.Create&lt;TKey&gt;(Expression&lt;Func&lt;TEntity, TKey&gt;&gt; expression) 调用的Expression expression。这允许同一 PropertyMetadata&lt;TEntity&gt; 的多个属性类型。
  • 是的,但即使使用构造函数,我仍然需要进行强制转换,因为表达式在变量中
  • 嗯?我提议var propertyMetadata = PropertyMetadata&lt;TEntity&gt;.Create(expression);,不需要演员表,因为它会直接接受表达式。

标签: c# expression


【解决方案1】:

我写了一个简单的扩展方法来做到这一点,没多久我只是在想有一个更简单的方法来投射

public static Expression<Func<TInput, object>> ToObjectExpression<TInput, TOutput>
                                       (this Expression<Func<TInput, TOutput>> expression)
{
    Expression converted = Expression.Convert(expression.Body, typeof(object));
    return Expression.Lambda<Func<TInput, object>>(converted, expression.Parameters);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多