C# 表达式树 - 允许将字节分配给 int 类型

本文关键字:分配 字节 int 类型 表达式 | 更新日期: 2023-09-27 18:31:05

我在数据访问代码的上下文中使用以下代码,在该代码中,我从数据表项(System.Data.DataRow)动态创建业务对象。我希望能够将从数据行检索到的字节列分配给业务对象上的整数字段。

using System;
using System.Linq.Expressions;
namespace TestConsole {
    class Program {
        static void Main(string[] args) {
            var targetExp = Expression.Parameter(typeof(object), "target");
            var valueExp = Expression.Parameter(typeof(object), "value");
            var propertyExpression = Expression.Property(Expression.Convert(targetExp, typeof(SomeClass)), "SomeInt");
            var assignmentExpression = Expression.Assign(propertyExpression, Expression.Convert(valueExp, typeof(SomeClass).GetProperty("SomeInt").PropertyType));
            var compliedExpression = Expression.Lambda<Action<object, object>>(assignmentExpression, targetExp, valueExp).Compile();
            var obj = new SomeClass();
            byte ten = 10;
            compliedExpression.Invoke(obj, 10);
            compliedExpression.Invoke(obj, (int)10); //this works and i want to do this cast using expression trees, any idea?
            compliedExpression.Invoke(obj, ten); //Specified cast is not valid.
            Console.WriteLine(obj.SomeInt);
            Console.ReadKey();
        }
    }
    class SomeClass {
        public int SomeInt { get; set; }
    }
}

C# 表达式树 - 允许将字节分配给 int 类型

您有一个盒装byte,并试图将其拆箱到int。这是站不住脚的。

object obj = (byte)10;
int i = (int)obj; // InvalidCastException: Specified cast is not valid.

您可以做的是调用 Convert.ToInt32 方法(对象):

int i = Convert.ToInt32(obj);
// i == 10

或 Convert.ChangeType 方法(对象、类型):

int i = (int)Convert.ChangeType(obj, typeof(int));
// i == 10

使用Expression.Convert我相信它会作为演员