簡體   English   中英

通過表達式的動態屬性設置器不起作用

[英]Dynamic property setter via expressions is not working

嗨,當我在控制台應用程序中運行該代碼時,我遵循了可以正常工作的代碼,但在真實應用程序中卻失敗了,提示“指定的轉換無效”。 在lambda_method(Closure,Object,Object)上,有人知道這是根本原因嗎?

    public class Base
    {

    }

    public class Test:Base
    {
        public string TestProp { get; set; }
    }

    static void Main(string[] args)
    {
        Base test = new Test();
        var prop=test.GetType().GetProperty("TestProp");
        var method = BuildSetAccessor(prop.SetMethod);
        method(test, "sa");
    }

    static Action<object, object> BuildSetAccessor(MethodInfo method)
    {

        var obj = Expression.Parameter(typeof(object), "o");
        var value = Expression.Parameter(typeof(object));

        Expression<Action<object, object>> expr =
            Expression.Lambda<Action<object, object>>(
                Expression.Call(
                    Expression.Convert(obj, method.DeclaringType),
                    method,
                    Expression.Convert(value, method.GetParameters()[0].ParameterType)),
                obj, value);


        return expr.Compile();
}

目前尚無答案,但我建議您將代碼更改為以下形式:

static Action<TOb, TPar> BuildSetAccessor<TOb, TPar>(MethodInfo method)
{
    var obj = Expression.Parameter(method.DeclaringType, "o");
    var value = Expression.Parameter(method.GetParameters()[0].ParameterType);

    if (method.GetParameters().Length > 1)
        throw new ArgumentException("Method with more than 1 parameters is not supported");

    LambdaExpression expr =
        Expression.Lambda(
            Expression.Call(
                obj,
                method,
                value),
            obj, value);

    var compiled = expr.Compile();
    return new Action<TOb, TPar>((o, p) => compiled.DynamicInvoke(o, p));
}

和用法:

var method = BuildSetAccessor<Base, object>(prop.SetMethod);
method(test, "1");

我認為這種方法比在LINQ查詢中強制轉換參數更好,因為生成的異常信息更加詳細。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM