- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
注意:请仔细注意这不是重复的。
我需要创建以下 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/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!