سؤال

وأنا أحاول أن استخدام تعبيرات لامدا في مشروع الخريطة إلى طرف ثالث الاستعلام API.لذلك أنا تحليل شجرة التعبير باليد.

إذا كنت تمر في التعبير امدا مثل:

p => p.Title == "title"

كل شيء يعمل.

ومع ذلك ، إذا كان لي امدا التعبير تبدو مثل:

p => p.Title == myaspdropdown.SelectedValue

باستخدام .الصافي المصحح لا أرى القيمة الفعلية التي funciton.بدلا من ذلك أرى شيئا مثل:

p => p.Title = (value(ASP.usercontrols_myaspusercontrol_ascx).myaspdropdown.SelectedValue)

ما يعطي ؟ و عندما كنت في محاولة للاستيلاء على الجانب الأيمن من التعبير كسلسلة ، أحصل على (value(ASP.usercontrols_myaspusercontrol_ascx).myaspdropdown.SelectedValue) بدلا من القيمة الفعلية. كيف يمكنني الحصول على القيمة الفعلية?

هل كانت مفيدة؟

المحلول

تذكر أنه عندما كنت تتعامل مع امدا التعبير تعبير شجرة, لم يكن لديك التعليمات البرمجية القابلة للتنفيذ.بدلا من ذلك لديك شجرة التعبير العناصر التي تشكل التعبير كتبته.

تشارلي كالفرت له وظيفة جيدة أن يناقش هذا بالتفصيل.وشملت هو مثال على استخدام تعبير التصوير من أجل التصحيح التعبيرات.

في حالة الحصول على قيمة من الجانب الأيمن من المساواة التعبير, سوف تحتاج إلى إنشاء جديد امدا التعبير تجميع ومن ثم الاحتجاج بها.

لقد اخترق معا مثال سريع من هذا - أتمنى أن يسلم ما تحتاجه.

public class Class1
{
    public string Selection { get; set; }

    public void Sample()
    {
        Selection = "Example";
        Example<Book, bool>(p => p.Title == Selection);
    }

    public void Example<T,TResult>(Expression<Func<T,TResult>> exp)
    {
        BinaryExpression equality = (BinaryExpression)exp.Body;
        Debug.Assert(equality.NodeType == ExpressionType.Equal);

        // Note that you need to know the type of the rhs of the equality
        var accessorExpression = Expression.Lambda<Func<string>>(equality.Right);
        Func<string> accessor = accessorExpression.Compile();
        var value = accessor();
        Debug.Assert(value == Selection);
    }
}

public class Book
{
    public string Title { get; set; }
}

نصائح أخرى

للحصول على القيمة الفعلية ، تحتاج إلى تطبيق منطق شجرة التعبير أيا كان السياق كنت قد حصلت.

المغزى من أشجار التعبير هو أنها تمثل المنطق البيانات بدلا من تقييم التعبير.سوف تحتاج إلى معرفة ما امدا التعبير حقا يعني.هذا قد يعني تقييم بعض أجزاء منه ضد البيانات المحلية - سوف تحتاج إلى أن تقرر لنفسك.أشجار التعبير هي قوية جدا, ولكن ليس مسألة بسيطة لتحليل واستخدامها.(أطلب من أي شخص كتب LINQ مزود...فرانس Bouma وقد تحسر صعوبات عدة مرات.)

فقط كانت تعاني نفس المشكلة بالضبط, شكرا بيفان.على امتداد التالية عام نمط يمكنك استخدام استخراج قيمة (باستخدام هذا الاستعلام بلدي محرك).

    [TestFixture]
public class TestClass
{
    [Test]
    public void TEst()
    {
        var user = new User {Id = 123};
        var idToSearch = user.Id;
        var query = Creator.CreateQuery<User>()
            .Where(x => x.Id == idToSearch);
    }
}

public class Query<T>
{
    public Query<T> Where(Expression<Func<T, object>> filter)
    {
        var rightValue = GenericHelper.GetVariableValue(((BinaryExpression)((UnaryExpression)filter.Body).Operand).Right.Type, ((BinaryExpression)((UnaryExpression)filter.Body).Operand).Right);
        Console.WriteLine(rightValue);
        return this;
    }
}

internal class GenericHelper
{
    internal static object GetVariableValue(Type variableType, Expression expression)
    {
        var targetMethodInfo = typeof(InvokeGeneric).GetMethod("GetVariableValue");
        var genericTargetCall = targetMethodInfo.MakeGenericMethod(variableType);
        return genericTargetCall.Invoke(new InvokeGeneric(), new[] { expression });
    }
}

internal class InvokeGeneric
{
    public T GetVariableValue<T>(Expression expression) where T : class
    {
        var accessorExpression = Expression.Lambda<Func<T>>(expression);
        var accessor = accessorExpression.Compile();
        return accessor();
    }
}

أنا لست متأكدا من أنني أفهم.أين أنت "رؤية" هذا ؟ هو أنه في وقت التصميم أو التشغيل ؟ امدا التعبيرات يمكن أن تكون أساسا مجهول المندوبين ، وسوف تعمل مع تأجيل التنفيذ.لذلك يجب أن لا نتوقع أن نرى القيمة التي تم تعيينها حتى بعد تنفيذ اجتاز هذا الخط الواضح.
أنا لا أعتقد أن هذا هو حقا ما تعنيه على الرغم من...إذا كان يمكنك توضيح السؤال قليلا ربما كنت يمكن أن تساعد :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top