0

データ テーブル アイテム (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; }
    }

}
4

2 に答える 2

1

ボックス化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
于 2013-09-13T03:30:35.293 に答える
0

Expression.Convertキャストとして機能すると思います

于 2013-09-13T05:00:04.697 に答える