无法从 `Expression<Func<T1, T2>>` 转换为 `Expression<Func<object, object>>`

这是不好的

更新:这个问题被标记为重复,但虽然我理解代码的问题,但我没有解决方案。代码是否可以通过仅更改方法主体而不是方法签名来工作?

ExpressionFunc建立类似的类时,将头周围的东西缠在一起

public class Test<TBase>
{
    private IList<Expression<Func<object, object>>> _expressions = new List<Expression<Func<object, object>>>();

    public void AddExpression<T>(Expression<Func<TBase, T>> e)
    {
        _expressions.Add(e);
    }

    public void AddExpression<T1, T2>(Expression<Func<T1, T2>> e)
    {
        _expressions.Add(e);
    }
}

我需要/想要保留一个表达式列表,其中的类型Func可能会有所不同。我虽然上面的代码可以工作,但它没有。它失败了:

Cannot convert from 'Expression<Func<TBase, T>>' to 'Expression<Func<object, object>>'

Cannot convert from 'Expression<Func<T1, T2>>' to 'Expression<Func<object, object>>'

Resharper说:

Argument type 'Expression<Func<TBase, T>>' is not assignable to parameter type 'Expression<Func<object, object>>'

Argument type 'Expression<Func<T1, T2>>' is not assignable to parameter type 'Expression<Func<object, object>>'

代码是否可以通过仅更改方法主体而不是方法签名来工作?

Xanatos

更新:这个问题被标记为重复,但是尽管我理解代码的问题,但是我没有解决方案。代码是否可以通过仅更改方法主体而不是方法签名来工作?

是的,您可以保留方法签名,但您必须重写表达式...

像这样:

public void AddExpression<T1, T2>(Expression<Func<T1, T2>> e)
{
    var originalParameter = e.Parameters[0];

    // object par1
    var parameter = Expression.Parameter(typeof(object), originalParameter.Name);

    // T1 var1
    var variable = Expression.Variable(typeof(T1), "var1");

    // (T1)par1
    var cast1 = Expression.Convert(parameter, typeof(T1));

    // var1 = (T1)par1;
    var assign1 = Expression.Assign(variable, cast1);

    // The original body of the expression, with originalParameter replaced with var1
    var body = new SimpleParameterReplacer(originalParameter, variable).Visit(e.Body);

    // (object)body (a cast to object, necessary in the case T2 is a value type. If it is a reference type it isn't necessary)
    var cast2 = Expression.Convert(body, typeof(object));

    // T1 var2; var1 = (T1)par1; (object)body;
    // (the return statement is implicit)
    var block = Expression.Block(new[] { variable }, assign1, cast2);
    var e2 = Expression.Lambda<Func<object, object>>(block, parameter);

    _expressions.Add(e2);
}

我正在使用SimpleParameterReplacer我前段时间给出的另一个回复。

最后 a (T1 x) => x.Something(与x.Somethinga T2)被转换为:

(object x) => 
{
    var var1 = (T1)x;
    return (object)var1.Something;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将Expression <Func <T1 >>转换为Expression <Func <T1,T2 >>

来自分类Dev

将Expression <Func <T,TProperty >>转换为Expression <Func <object,object >>,反之亦然

来自分类Dev

如何将Expression <Func <T,object >>转换为Expression <Func <T,bool >>?

来自分类Dev

将Expression <Func <T,bool >>转换为Expression <Func <T1,bool >>,以便T是T1的成员

来自分类Dev

将Func <T,TProperty>转换为Expression <Func <T,Property >>

来自分类Dev

将 Expression<Func<Tin, object>> 转换为 Expression<Func<Tin, Tout>>

来自分类Dev

如何将 Expression<Func<TSource,string>> 转换为 Expression<Func<object,string>>

来自分类Dev

Expression <Func <T,object >>到Expression <Func <T,TResult >>的一般拆箱

来自分类Dev

获取由Expression <Func <T,U >>访问的每个属性的Expression <Func <T,object >>

来自分类Dev

Expression <Func <T,object >>到Expression <Func <T,TResult >>的一般拆箱

来自分类Dev

如何将委托`Func<T1, Func<T2, Task<TResult>>>` 转换为`Func<T1, Task<Func<T2, TResult>>`?

来自分类Dev

在方法中使用IEnumerable <Expression <Func <T,Object >>>

来自分类Dev

将Expression <Func <T,V >>转换为Expression <Func <T,Nullable <V >>>

来自分类Dev

是否可以将Expression <Func <T,bool >>转换为Expression <Func <MyType,bool >>?

来自分类Dev

将表达式转换为Expression <Func <T,bool >>

来自分类Dev

如何将 BinaryExpression 转换为 Expression<Func<T, bool>>?

来自分类Dev

无法理解如何编码Func <Func <T1,T2>,T3>

来自分类Dev

无法将类型System.Linq.Expression <System.Func <Object,bool >>隐式转换为bool

来自分类Dev

如何将Func <T,object>转换为Func <Exception,object>

来自分类Dev

如何将Func <T,object>转换为Func <Exception,object>

来自分类Dev

C#成员表达式Func <T,object>转换为Func <T,bool> MethodBinaryExpression

来自分类Dev

我无法通过func <T1,T2>获得C#方法名称

来自分类Dev

使用Expression <Func <T,object >>中的信息创建运行时谓词

来自分类Dev

EF核心的HasIndex(Expression <Func <T,object >>)是否始终获得正确的索引顺序?

来自分类Dev

从属性名称到将Expression <Func <T,object >>传递给映射方法

来自分类Dev

方法重载中的 Expression<Func<T,bool>> 与 Func<T,bool>

来自分类Dev

如何将IQueryable <T>转换为Expression <Func <T,bool >>?

来自分类Dev

如何在C#中将LambdaExpression转换为Expression <Func <T,bool >>

来自分类Dev

正文Expression <Func <T,bool >>的复杂编辑

Related 相关文章

  1. 1

    将Expression <Func <T1 >>转换为Expression <Func <T1,T2 >>

  2. 2

    将Expression <Func <T,TProperty >>转换为Expression <Func <object,object >>,反之亦然

  3. 3

    如何将Expression <Func <T,object >>转换为Expression <Func <T,bool >>?

  4. 4

    将Expression <Func <T,bool >>转换为Expression <Func <T1,bool >>,以便T是T1的成员

  5. 5

    将Func <T,TProperty>转换为Expression <Func <T,Property >>

  6. 6

    将 Expression<Func<Tin, object>> 转换为 Expression<Func<Tin, Tout>>

  7. 7

    如何将 Expression<Func<TSource,string>> 转换为 Expression<Func<object,string>>

  8. 8

    Expression <Func <T,object >>到Expression <Func <T,TResult >>的一般拆箱

  9. 9

    获取由Expression <Func <T,U >>访问的每个属性的Expression <Func <T,object >>

  10. 10

    Expression <Func <T,object >>到Expression <Func <T,TResult >>的一般拆箱

  11. 11

    如何将委托`Func<T1, Func<T2, Task<TResult>>>` 转换为`Func<T1, Task<Func<T2, TResult>>`?

  12. 12

    在方法中使用IEnumerable <Expression <Func <T,Object >>>

  13. 13

    将Expression <Func <T,V >>转换为Expression <Func <T,Nullable <V >>>

  14. 14

    是否可以将Expression <Func <T,bool >>转换为Expression <Func <MyType,bool >>?

  15. 15

    将表达式转换为Expression <Func <T,bool >>

  16. 16

    如何将 BinaryExpression 转换为 Expression<Func<T, bool>>?

  17. 17

    无法理解如何编码Func <Func <T1,T2>,T3>

  18. 18

    无法将类型System.Linq.Expression <System.Func <Object,bool >>隐式转换为bool

  19. 19

    如何将Func <T,object>转换为Func <Exception,object>

  20. 20

    如何将Func <T,object>转换为Func <Exception,object>

  21. 21

    C#成员表达式Func <T,object>转换为Func <T,bool> MethodBinaryExpression

  22. 22

    我无法通过func <T1,T2>获得C#方法名称

  23. 23

    使用Expression <Func <T,object >>中的信息创建运行时谓词

  24. 24

    EF核心的HasIndex(Expression <Func <T,object >>)是否始终获得正确的索引顺序?

  25. 25

    从属性名称到将Expression <Func <T,object >>传递给映射方法

  26. 26

    方法重载中的 Expression<Func<T,bool>> 与 Func<T,bool>

  27. 27

    如何将IQueryable <T>转换为Expression <Func <T,bool >>?

  28. 28

    如何在C#中将LambdaExpression转换为Expression <Func <T,bool >>

  29. 29

    正文Expression <Func <T,bool >>的复杂编辑

热门标签

归档