Expression.Lambda() 的参数问题

2024-04-07

更新:这确实有效,我很愚蠢:(

我有以下扩展方法

public static string ExtMethod(this object self, object myparameter);

在运行时,可以通过多种方式调用它,我认为这些都是可能的:

Expression<Func<T, string>> expr = x => x.property.ExtMethod(5);
Expression<Func<T, string>> expr = x => x.property.ExtMethod(new object());
Expression<Func<T, string>> expr = x => x.property.ExtMethod(someMethod());
Expression<Func<T, string>> expr = x => x.property.ExtMethod(x.someMethod());
Expression<Func<T, string>> expr = x => x.property.ExtMethod(x.OtherProperty);

我需要做的是评估“myparameter”,给定“expr”和一个“T"

因为这两种情况x用于myparameter,我想我需要创建一个以下形式的委托:

Expression<Func<T, object>> expr = x => [myparameter expression here]

我认为这会起作用:

var extMethodExpr = expr.Body as MethodCallExpression;
var myparameterExpr = extMethodExpr.Arguments[1];

var myparam = Expression.Lambda(myparameterExpr, expr.Parameters).Compile().Invoke(someT)

但对于不涉及的表达式x,我明白了TargetParameterCountException:(罢工>

在这些情况下,如果我这样做:

var myparam = Expression.Lambda(myparameterExpr).Compile().Invoke(someT)

效果很好。

我该如何解决这个问题?

thanks


好的;追根究底;在行中:

var myparam = Expression.Lambda(myparameterExpr).Compile().Invoke(someT);

如果你不想传递一个someT,这适用于那些不涉及的表达式x在论证中;对于那些这样做的人,您需要告诉 lambda 包含该参数(与原始 lambda 相同的参数) - 只需通过:

var myparam = Expression.Lambda(myparameterExpr,
             outerLambda.Parameters[0]).Compile().Invoke(someT);

这是一些计算内部参数的工作代码(给定参数类型的实例);请注意,我使用该参数,即使它doesn't涉及一个x- 否则,它会对实例做什么?

using System;
using System.Linq.Expressions;
using System.Reflection;
class Foo {
    public string Bar {get;set;}
    public int someMethod() { return 4; }
    public int OtherProperty { get { return 3; } }
}
static class Program
{
    static int someMethod() { return 3; }
    static void Main()
    {
        Foo foo = new Foo();
        Test<Foo>(x => x.Bar.ExtMethod(5), foo);
        Test<Foo>(x => x.Bar.ExtMethod(new object()), foo);
        Test<Foo>(x => x.Bar.ExtMethod(someMethod()), foo);
        Test<Foo>(x => x.Bar.ExtMethod(x.someMethod()), foo);
        Test<Foo>(x => x.Bar.ExtMethod(x.OtherProperty), foo);
    }
    static void Test<T>(Expression<Func<T, string>> expr, T instance)
    {
        if (expr.Body.NodeType != ExpressionType.Call)
        {
            throw new InvalidOperationException("Call expected");
        }
        var call = ((MethodCallExpression)expr.Body);
        if (call.Method != typeof(Program).GetMethod(
            "ExtMethod", BindingFlags.Static | BindingFlags.NonPublic))
        {
            throw new InvalidOperationException("ExtMethod expected");
        }
        // we know that ExtMethod has 2 args; pick myParameter (the 2nd);
        // then build an expression over arg, re-using our outer param
        var newLambda = Expression.Lambda<Func<T, object>>(
            call.Arguments[1], expr.Parameters[0]);

        // evaluate it and show the argument value
        object value = newLambda.Compile()(instance);
        Console.WriteLine(value);
    }
    static string ExtMethod(this object self, object myParameter) {
        return self.ToString();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Expression.Lambda() 的参数问题 的相关文章

随机推荐

  • make_shared真的比new更高效吗?

    我正在尝试shared ptr and make shared从 C 11 编写了一个小玩具示例来看看调用时实际发生了什么make shared 作为基础设施 我使用 llvm clang 3 0 以及 XCode4 中的 llvm std
  • 共享首选项和微调器不维护状态

    我有一个像这样的旋转器 Spinner 1 final Spinner plan Spinner dialog findViewById R id spinner1 strings getResources getStringArray R
  • Android - 使用外部浏览器在 WebView 中打开目标 _blank 链接

    我建立一个WebView显示一个网站 该网站包含无链接的链接target blank 属性和一些带有它的 我需要打开链接target在外部标准设备浏览器中定义的以及在 WebView 内部没有定义的 我正在使用一个WebViewClient
  • dart 中整数的最大值是多少?

    我到处都找过 但找不到与该主题相关的任何信息 另外 dart 中是否有类似 java 的 Long BigDecimal 数据类型 Dart 2 对于 dart2js 生成的 JavaScript Pixel Elephant 的答案仍然是
  • 在 ruby​​ 中处理大型 CSV 文件 (20G)

    我正在解决一个小问题 并会就如何解决它提供一些建议 给定一个列数和行数未知的 csv 文件 输出包含值的列列表以及每个值重复的次数 不使用任何库 如果文件很小 这应该不是问题 但是当它是几场演出时 我得到 NoMemoryError 无法分
  • 为什么静态方法需要包装到类中?

    对于这个问题的无知性质 我深表歉意 如果有一个简单的答案 只需一个解释链接就会让我非常高兴 经过 6 个月的编程后 我发现静态类对于存储适用于许多不同类的例程有点有用 这是我如何使用静态类的一个简化示例 它是一个用于将文本解析为各种内容的类
  • 如何在 Lighttable 中创建基本的 ClojureScript Hello World 应用程序?

    LightTable 中的文档似乎相当稀疏 我想在 LightTable 中创建一个非常简单的 ClojureScript Web 应用程序作为构建的起点 我让 Clojure 中的 Instarepl 工作正常 然后创建一个名为 dumm
  • 从计算机商店删除证书

    我很难让 powershell 删除意外安装到我们所有 Windows 7 计算机上的计算机商店的证书 作为示例 我提供了证书安装位置的屏幕截图 这不是实际的证书 我们有几百台机器 因此我们希望尽可能自动化地完成此操作 如果有人可以提供一种
  • 请识别此算法:数据流中的概率前 k 个元素

    我记得几年前听说过以下算法 但在网上找不到任何参考 它仅使用 m 个计数器来识别 n 个元素的数据流中的前 k 个元素 或重量级元素 这对于在使用最少内存的情况下查找热门搜索词 网络滥用者等特别有用 算法 对于每个元素 如果该元素还没有计数
  • 加速“最接近”字符串匹配算法

    我目前正在处理一个非常大的位置数据库 并尝试将它们与现实世界的坐标相匹配 为了实现这一点 我下载了地名数据集 https www geonames org export 其中包含很多条目 它给出了可能的名称和纬度 经度坐标 为了尝试加快该过
  • Java 相当于一个类。 == 与 .equals 相同

    我们可以做一个 on a Class变量而不是equals并期望相同的结果 例如 Class clazz xyz Case A if clazz Date class do something Case B if Date class eq
  • jqGrid 传递值到表单编辑

    我有一个 jqGrid 字段 如下所示 colModel name Enabled index Enabled width 45 editable true edittype checkbox editoptions value 1 0 f
  • 安装 laravel --prefer-dist

    我正在他们的网站上关注 Laravel 安装 我遇到了这条线 composer create project laravel laravel prefer dist 现在 到底是什么 prefer dist部分意思是 我在他们的文档中看不到
  • 使用 SpannedgridLayoutManager 后,recyclerView 占用了顶部的大量空间

    我想在 recyclerview 的 Spanned GridLayoutManager 中显示列表数据 但是添加辅助类 Spanned GridLayoutmanager 后 在我的 recycleview 中占用了顶部的大量空间 iam
  • 防止@EnableWebMvc注释的类被@ComponentScan拾取

    我有以下测试类 ActiveProfiles DataTC test RunWith SpringJUnit4ClassRunner class ContextConfiguration classes BaseTestConfigurat
  • MyBatis:使用动态查询比较字符串值

    我正在使用 MyBatis 来映射一些需要比较的查询String争论 myString 我的地图绘制者界面 is public Map
  • NHibernate二级缓存性能问题

    我正在使用 NHibernate 使用每个请求会话模式开发一个 MVC 应用程序 大多数时候用户只是读取数据 因此我尝试通过以下方式使用 NHibernate 的二级缓存 我设置了 SysCache 并使所有持久实体可缓存 缓存使用 non
  • 普通数组也是动态的吗? [复制]

    这个问题在这里已经有答案了 以下是我的C代码 main int a 1 a 0 10 a 1 12 printf d n a 1 copy arr a printf d a 1 以下是输出 12 12 它不应该给出数组越界或类似的东西吗 或
  • 使用 setText 方法时 JLabel 不更新

    在我目前正在进行的项目中 我希望通过 Jlabel 显示几条信息 GUI 中的其他位置有一些按钮和文本字段 允许更改所述信息 我想更新 JLabel 但文本永远不会更改 或在启动时更新 我尝试使用并发来更新标签 正如本网站上其他问题中所建议
  • Expression.Lambda() 的参数问题

    更新 这确实有效 我很愚蠢 我有以下扩展方法 public static string ExtMethod this object self object myparameter 在运行时 可以通过多种方式调用它 我认为这些都是可能的 Ex