gpt4 book ai didi

c# - 动态生成属性表达式和空参数

转载 作者:行者123 更新时间:2023-12-05 06:54:57 25 4
gpt4 key购买 nike

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

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

() => model.property

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

public object GenerateLambda(object model, string property) 
{

}

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

更新: GenerateLambda 的返回类型现在对我来说不重要。任何可以代替 ()=>model.property 的结果被接受。我使用 object 的原因是我不知道属性的通用类型,它们应该是动态的,但正如我测试的那样,可以将 object 转换为 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 .我会说不可能。

关于c# - 动态生成属性表达式和空参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65434500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com