第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

重寫表達(dá)式的類型<T>

重寫表達(dá)式的類型<T>

C#
偶然的你 2022-08-20 16:08:12
是否可以動態(tài)重寫 一個 ,用另一種類型替換 一個元素?Expression<T>T例如,在以下情況下將 替換為:DocumentTypeADocumentTypeBExpression<Func<DocumentTypeA, bool>> expression = m => m.Details.Id == "an-id"Expression<Func<DocumentTypeA, bool>> expression = m => m.Details.Id == "an-id" && m.AnInt == 42Expression<Func<DocumentTypeA, bool>> expression = m => m.AString == "I'm a string"我需要決定在運行時使用哪種類型,而不是編譯時。同樣值得注意的是,它們之間并不相關(guān),除了它們的屬性是相同的。DocumentTypeADocumentTypeB最終結(jié)果是重新處理它們,使它們現(xiàn)在看起來像Expression<Func<DocumentTypeB, bool>> expression = m => m.Details.Id == "an-id"Expression<Func<DocumentTypeB, bool>> expression = m => m.Details.Id == "an-id" && m.AnInt == 42Expression<Func<DocumentTypeB, bool>> expression = m => m.AString == "I'm a string"因此,表達(dá)式的實際比較部分保持不變,只有頂級類型已更改。
查看完整描述

2 回答

?
慕尼黑8549860

TA貢獻(xiàn)1818條經(jīng)驗 獲得超11個贊

可以使用表達(dá)式訪問器替換該類型。


class ParameterRewriter<T, U> : ExpressionVisitor

{

    protected override Expression VisitParameter(ParameterExpression node)

    {

        if (node.Type.Equals(typeof(T)))

        {

            return Expression.Parameter(typeof(U), node.Name);

        }


        return base.VisitParameter(node);

    }


    protected override Expression VisitMember(MemberExpression node)

    {

        if (node.Expression is ParameterExpression paramExp && paramExp.Type.Equals(typeof(T)))

        {

            return Expression.MakeMemberAccess(

                Expression.Parameter(typeof(U), paramExp.Name),

                typeof(U).GetMember(node.Member.Name).Single());

        }


        return base.VisitMember(node);

    }


    protected override Expression VisitLambda<L>(Expression<L> node)

    {

        var parameters = node.Parameters.ToList();

        var found = false;


        for (var i = 0; i < parameters.Count; i++)

        {

            if (parameters[i].Type.Equals(typeof(T)))

            {

                parameters[i] = Expression.Parameter(typeof(U), parameters[i].Name);

                found = true;

            }

        }


        if (found)

        {

            return Expression.Lambda(node.Body, parameters);

        }


        return base.VisitLambda(node);

    }

}

在這種情況下,創(chuàng)建一個實例并訪問原始表達(dá)式樹,您將獲得所需的內(nèi)容。擴(kuò)展方法可能更具可讀性:new ParameterRewriter<DocumentTypeA, DocumentTypeB>()


public static class ExpressionExtensions

{

    public static Expression<Func<U, R>> RewriteParameter<T, U, R>(this Expression<Func<T, R>> expression)

    {

        var rewriter = new ParameterRewriter<T, U>();

        return (Expression<Func<U, R>>)rewriter.Visit(expression);

    }

}

用法很簡單:


Expression<Func<A, bool>> expA = x => x.Id == 1;

Expression<Func<B, bool>> expB = expA.RewriteParameter<A, B, bool>();


查看完整回答
反對 回復(fù) 2022-08-20
?
PIPIONE

TA貢獻(xiàn)1829條經(jīng)驗 獲得超9個贊

使用兩個類都繼承的接口,并包含兩個類中相同的屬性,例如


interface IDocumentTypes

{

    string AString { get; set; } //indicates that both classes need to implement this

    //etc...

}


class DocumentTypeA : IDocumentTypes

{

    //your class

}

然后,您的兩個類都可以在實現(xiàn)接口時使用,并且仍然是強(qiáng)類型。除了實現(xiàn)接口中定義的屬性/函數(shù)之外,這些類不需要有任何共同點。ExpressionIDocumentTypes


查看完整回答
反對 回復(fù) 2022-08-20
  • 2 回答
  • 0 關(guān)注
  • 108 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號