如何在使用Expression <Func <T >>时设置参数

泰勒

我已经编写了以下代码来处理从数据库到数据类型的映射参数(相信我,我希望我可以使用标准ORM,但是由于许多原因,这是不可行的)

public void LoadDatabaseValue<T>(DataTable partData, string identifier, string mappingName, Expression<Func<T>> mappingProperty)
    {
        var partAttributeValue = mappingProperty.Name;
        var memberExpression = (MemberExpression)mappingProperty.Body;
        var prop = (PropertyInfo)memberExpression.Member;
        try
        {
            var selectedRow = partData.Select($"partattributename = '{mappingName}'");
            var selectedValue = selectedRow[0]["PartAttributeValue"];

            var typedOutput = (T)Convert.ChangeType(selectedValue, typeof(T));

            prop.SetValue(memberExpression.Expression, typedOutput, null);
        }
        catch (Exception exception)
        {
            _databaseImportError = true;
            // code to log this error
    }

当我尝试运行此程序时,出现以下异常

{System.Reflection.TargetException: Object does not match target type.
at System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)
at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj,   BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index)   }

当我调试它时,我的typedOutput会与我的属性类型对齐,因此我不确定为什么会引发此异常。

我用这样的方式称呼它

LoadDatabaseValue(partData, identifier, "Offset", () => Offset);
伊万·斯托夫(Ivan Stoev)

如果要保留当前的方法设计,则需要一种方法以某种方式评估memberExpression.Expression以便能够调用SetValue方法。

所以换行

prop.SetValue(memberExpression.Expression, typedOutput, null);

prop.SetValue(Evaluate(memberExpression.Expression), typedOutput, null);

然后使用以下实现之一:

(A)如果仅使用属性访问器,这将足够:

static object Evaluate(Expression e)
{
    if (e == null) return null;
    var me = e as MemberExpression;
    if (me != null)
        return ((PropertyInfo)me.Member).GetValue(Evaluate(me.Expression), null);
    return ((ConstantExpression)e).Value;
}

(B)这是更通用的,但较慢:

static object Evaluate(Expression e)
{
    if (e == null) return null;
    return Expression.Lambda(e).Compile().DynamicInvoke();
}

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当Func <t,t>是必需的类型时,如何传递其他参数?

来自分类Dev

在方法内部使用Expression <Func <T,Boolean >>谓词时出错,提示“类型'T'必须是引用类型”

来自分类Dev

Func <T,TResult>访问参数

来自分类Dev

如何将 Func<T> 传递给方法参数

来自分类Dev

使用NSubstitute在单元测试中验证Expression <Func <T,bool >>参数

来自分类Dev

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

来自分类Dev

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

来自分类Dev

带有参数IQueryable <T>和Expression <Func <T,T >>的.net通用方法

来自分类Dev

使用List <Func <T,object >>时,索引超出数组的范围

来自分类Dev

使用List <Func <T,object >>时,索引超出数组的范围

来自分类Dev

如何使用类型变量中的类型参数创建Expression <Func <>>

来自分类Dev

如何使用func <>设置属性

来自分类Dev

如何在C#中使用未知数量和参数类型包装Func <T1 ... Tn>?

来自分类Dev

如何修改Expression <Func <???,bool >>的类型参数?

来自分类Dev

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

来自分类Dev

将Func <T,T>动作用作带有<T>的函数的参数,以及如何编写主体?

来自分类Dev

如何获取Expression <Func <T,TK >>的T的实例

来自分类Dev

如何合并两个 Expression<Func<T, T>

来自分类Dev

设置任何Func <>的参数

来自分类Dev

如何使用Func <Task <T >>语法?

来自分类Dev

如何使用 Func<string, T> 作为参数之一调用方法

来自分类Dev

C#Func <T,TResult>参数验证

来自分类Dev

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

来自分类Dev

使用MethodInfo创建func <T,T>

来自分类Dev

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

来自分类Dev

如何使Func <>的某些参数可选?

来自分类Dev

如何设置Func <>的属性Target?

来自分类Dev

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

来自分类Dev

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

Related 相关文章

  1. 1

    当Func <t,t>是必需的类型时,如何传递其他参数?

  2. 2

    在方法内部使用Expression <Func <T,Boolean >>谓词时出错,提示“类型'T'必须是引用类型”

  3. 3

    Func <T,TResult>访问参数

  4. 4

    如何将 Func<T> 传递给方法参数

  5. 5

    使用NSubstitute在单元测试中验证Expression <Func <T,bool >>参数

  6. 6

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

  7. 7

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

  8. 8

    带有参数IQueryable <T>和Expression <Func <T,T >>的.net通用方法

  9. 9

    使用List <Func <T,object >>时,索引超出数组的范围

  10. 10

    使用List <Func <T,object >>时,索引超出数组的范围

  11. 11

    如何使用类型变量中的类型参数创建Expression <Func <>>

  12. 12

    如何使用func <>设置属性

  13. 13

    如何在C#中使用未知数量和参数类型包装Func <T1 ... Tn>?

  14. 14

    如何修改Expression <Func <???,bool >>的类型参数?

  15. 15

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

  16. 16

    将Func <T,T>动作用作带有<T>的函数的参数,以及如何编写主体?

  17. 17

    如何获取Expression <Func <T,TK >>的T的实例

  18. 18

    如何合并两个 Expression<Func<T, T>

  19. 19

    设置任何Func <>的参数

  20. 20

    如何使用Func <Task <T >>语法?

  21. 21

    如何使用 Func<string, T> 作为参数之一调用方法

  22. 22

    C#Func <T,TResult>参数验证

  23. 23

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

  24. 24

    使用MethodInfo创建func <T,T>

  25. 25

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

  26. 26

    如何使Func <>的某些参数可选?

  27. 27

    如何设置Func <>的属性Target?

  28. 28

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

  29. 29

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

热门标签

归档