小编LaZ*_*aZe的帖子

加入lambda表达式

我如何加入像theese这样的两个lambda表达式:

Expression<Func<string, bool>> expr1 = a => a.Length > 100;
Expression<Func<string, bool>> expr2 = b => b.Length < 200;
Run Code Online (Sandbox Code Playgroud)

......变成这样的表达式:

Expression<Func<string, bool>> expr3 = s => s.Length < 100 && s.Length < 200;
Run Code Online (Sandbox Code Playgroud)

也就是说,将它们与AndAlso运算符连接起来.(或者任何其他运营商......)

我实际上成功地进行了一些讨厌的递归替换lambda参数,然后加入Expression.AndAlso方法.但我正在寻找更简单的东西.

例如:(显然不起作用.)

Expression<Func<string, bool>> expr3 = c => expr1(a) && expr2(b);
Run Code Online (Sandbox Code Playgroud)

c# lambda

8
推荐指数
1
解决办法
1450
查看次数

奇怪的C#动态行为

在研究C#动态关键字如何工作时,我偶然发现了一些奇怪的行为.它几乎看起来像一个bug,但它可能更有可能是这种行为的原因.

在下面的代码中,有两个调用,一个调用obj1,一个调用obj2,但只有一个调用正确执行.似乎局部变量类型是原因,但也应该可以从IDynamicTarget访问"Hello",因为它扩展了IDynamicTargetBase.

namespace DynamicTesting
{
    interface IDynamicTargetBase
    {
        string Hello(int a);
    }

    interface IDynamicTarget : IDynamicTargetBase
    {
    }

    class DynamicTarget : IDynamicTarget
    {
        public string Hello(int a)
        {
            return "Hello!";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            dynamic a = 123;

            IDynamicTargetBase obj1 = new DynamicTarget();
            obj1.Hello(a);  // This works just fine

            IDynamicTarget obj2 = new DynamicTarget();
            obj2.Hello(a); // RuntimeBinderException "No overload for method 'Hello' takes '1' arguments"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c# dynamic-language-runtime dynamic

7
推荐指数
1
解决办法
157
查看次数

标签 统计

c# ×2

dynamic ×1

dynamic-language-runtime ×1

lambda ×1