动态生成属性和空参数的表达式

2023-11-30

Note:请仔细注意,这不是重复的。

我需要创建以下 Lambda 表达式:

() => model.property

模型及其属性将在运行时确定。我想要一个接受模型和属性并生成表达式的函数:

public object GenerateLambda(object model, string property) 
{

}

如果可能的话,我不希望该函数是通用的。 但我认为我遇到的主要问题是()表达。

Update :返回类型为GenerateLambda现在对我来说并不重要。任何可以替换的结果()=>model.property被接受。我使用对象的原因是我不知道属性的通用类型,它们应该是动态的,但正如我测试的那样,可以将对象强制转换为Expression<Func<TValue?>>这是我需要的最终类型(TValue是属性类型,但它将在运行时确定)。

我创建了一系列具有属性的 Blazor 组件(即For) 类型Expression<Func<TValue?>>用于提取模型的自定义属性。我使用此属性的方法是将其设置为 Func,如下所示:() => person.FirstName。现在我需要为对象(模型)的每个属性动态生成此表达式。假设对象及其类型本身不是动态创建创建的。

所以对于模型中的每个属性 p 我想调用GenerateLambda(object model, string property)应该返回() => model.p.

伪代码:

foreach(propertyInfo p in model){
   var result= GenerateLambda(model, p, X or any parameter that is needed);
   MyComponent.For= result;
    ... // other logics
}

像这样的事情:

public static IEnumerable<Func<object>> GetGetters(object obj)
{
    var type = obj.GetType();

    var obj2 = Expression.Constant(obj);

    foreach (var prop in type.GetProperties())
    {
        Expression prop2 = Expression.Property(obj2, prop);

        // The boxing for value type is explicit, 
        // downcasting to reference type is implicit
        if (prop2.Type.IsValueType)
        {
            prop2 = Expression.Convert(prop2, typeof(object));
        }

        var lambda = Expression.Lambda<Func<object>>(prop2);
        var compiled = lambda.Compile();
        yield return compiled;
    }
}

像这样使用:

var model = new
{
    Prop1 = 1,
    Prop2 = new[] { 1, 2, 3 },
    Prop3 = "Hello"
};

var test = GetGetters(model).ToArray();

这是代码的 v1...更好的版本会围绕obj并缓存表达式树...不确定这是否真的可能。嗯,不...用表达式树进行柯里化似乎是不可能的。对于表达式树来说,创建一个返回另一个方法的方法是一个大禁忌。你需要反射发射。

需要明确的是,最佳方案是能够生成以下内容:

public static Func<object>[] MakeGetterProp1(MyClass obj)
{
    Func<object> fn1 = () => obj.Prop1;
    Func<object> fn2 = () => obj.Prop2;
    return new[] { fn1, fn2 };
}

通过使用表达式树。该方法将第一次构建并缓存。然后你可以调用它并接收一组Fun<object>围绕特定的“封闭”obj。我想说不可能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态生成属性和空参数的表达式 的相关文章

随机推荐

  • for 循环的类型开始非法?

    为什么我收到错误 java 16 错误 类型非法开始 for int i 0 i lt 9 i 我检查了旧实验室 这是我认为的正确用法 import javax swing import java awt import java awt e
  • 如何捕捉 TOLEContainer 外部编辑器关闭的时刻?

    Borland Developer Studio 2006 德尔福 我有一个带有AllowInPlace False 的TOLEContainer 对象 当外部编辑器关闭并更改我的 OLE 对象时 我必须在 TOLeContainer 内对
  • 使用 .pch 文件包含应用程序文件

    我刚刚知道 如果我们在 pch 文件中包含任何内容 则不必稍后包含在其他文件中 现在我正在考虑将所有文件添加到其中 这样我就不必将它们包含在其他文件中并在每个文件的开头造成混乱 但我在想这是否是一个好的做法 如果没有 为什么 如果好的话 为
  • 为什么 exec() 在函数内部调用时工作方式不同以及如何避免它

    我试图在其中声明两个函数execpython 中的语句 让我们称呼他们为f1 and f2 我发现当exec在某个函数内部调用 然后f2 没有可见性f1 然而 当以下情况时 这不会发生exec和函数调用都放在全局代码中 Case 1 Wor
  • c=C# 中可以使用多个迭代器吗?

    C NET 中是否可以使用多个迭代器 针对单个类或对象 如果是的话 请给我一些简单的例子 抱歉 如果问题无法理解 请让我说清楚 您当然可以创建不同的迭代器以不同的方式进行遍历 例如 您可以 public class Tree
  • 如何使用 Apache JMeter POST GZip 请求

    我有一个关于使用 Apache JMeter 的问题 我们的项目 Android 应用程序将带有 Gzip 压缩 的 json 数据发布到 API 服务器 Android 应用程序使用 Apache HttpClient 及其 Gzipco
  • Flutter:长按图片即可像 Instagram 一样缩放预览

    所以我目前有一个图片网格 我想实现 Instagram 的一项功能 如果长按其中一张图片 您会在屏幕中间看到该图片的放大版本 如果停止按下 图像就会消失 我真的不需要代码 但我只是想不出我应该使用哪些小部件 可能有类似这样的东西的包吗 如果
  • 方法优化

    我有一个 void 函数 里面有很多 if 语句 并且所有这些语句都是必需的 我真的无法删除任何内容 但我觉得还可以做得更好 使用一些LINQ Where 课程或类似的东西 我要优化表达void Smooth尽可能少的字符 void Smo
  • 推断类型为“AnyClass”,这可能是意外的

    这是我的代码 if let runningTests NSClassFromString XCTestCase return false 编译器警告 不断的 runningTests 被推断为 AnyClass 类型 这可能 出乎意料 我需
  • Angular 6 - Google Picker API 弹出窗口

    只能偶尔访问一次 Google Picker 每次我打开应用程序时 Google Picker 弹出窗口都不会打开 我正在 Angular 6 中实现 Google Picker API 我在 Angular 的 asset 文件夹中为连接
  • 提高 OpenCV 中的相机捕获分辨率

    在我的 C C 程序中 我使用OpenCV从我的网络摄像头捕获图像 相机 罗技 QuickCam IM 可以以分辨率捕获320x240 640x480 and 1280x960 但是 出于某种奇怪的原因 OpenCV 给了我分辨率图像320
  • 模板的模板成员的消歧模板关键字:具体什么时候?

    这里给出了有关模板消歧器的问题 模板消歧器 在答案中我们可以看到 ISO C 0314 2 4 当成员模板专业化的名称出现在 后时 或 gt 在后缀表达式中 或在限定 ID 中的嵌套名称说明符之后 并且后缀表达式或限定 ID 显式依赖于模板
  • 一起处理异常的公共部分

    我目前正在尝试重构一些代码 一大堆异常有一些针对所有异常的通用代码 以及一些需要针对每个特定异常类型单独处理的特定代码 我试图找出如何摆脱每个的共同部分catch堵塞 一个想法是这样做 try Stuff that may fail cat
  • AWS ElasticBeanstalk 符号链接

    我不想将我的 config database yml 文件放在 GITHUB 中 而是将其放在某个地方并执行如下所示的符号链接 config database yml gt var www database yml 在 elasticbea
  • 不带 src 属性但带 class 属性的 img 标签随机显示

    我刚刚在 stackoverflow 中遇到一个问题 用户想要在 html 中给出一个图标 但不使用 img src smiley gif alt Smiley face width 42 height 42 但是 使用类似的类 img c
  • 返回类型推导[重复]

    这个问题在这里已经有答案了 可能的重复 在 C 11 中省略返回类型 在 C 11 中 如果主体仅包含 return 语句 则 lambda 可以推断出它们的返回类型 A提案即是作品取消这个限制 显然它已经在 GCC 中运行了 有什么原因不
  • 获取 Inno Setup 中父文件夹的路径

    我需要获取父文件夹 app 如果最终用户没有更改默认值 这是标准的 但如果他这样做了 问题就会变得更大 基本上 我需要一个函数 它将输出直到最后的所有内容 反斜杠 包含 想尝试一下Pos 但它只检测该字符的第一个实例 Use the Ext
  • Win7和Win10之间的定时器差异

    我有一个应用程序 我使用 MinGW 实现gettimeofday在Win7上实现 精确 计时 1ms精度 效果很好 然而 当在Win10上使用相同的代码 甚至相同的 exe 时 精度急剧下降到著名的15 6ms精度 这对我来说还不够 两个
  • Java 的 WS-Discovery 实现 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 JAX WS RI Axis2 CXF 或其他工具包是否有 WS Discovery 规范的实现 据我所知 唯一的 Java 实现是这个 http
  • 动态生成属性和空参数的表达式

    Note 请仔细注意 这不是重复的 我需要创建以下 Lambda 表达式 gt model property 模型及其属性将在运行时确定 我想要一个接受模型和属性并生成表达式的函数 public object GenerateLambda