- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个基于表达式的小型属性分配器。
这个想法非常简单,只需创建一个获取对象属性并将其分配给另一个对象属性的 Action。
所以如果我处理这个表达式:
public static Action PropertyAssign(object sourceObject, object destObject,
PropertyInfo sourceProperty, PropertyInfo destProperty)
{
Expression source = Expression.PropertyOrField(
Expression.Constant(sourceObject), sourceProperty.Name);
Expression dest = Expression.PropertyOrField(
Expression.Constant(destObject), destProperty.Name);
Expression assign = Expression.Assign(dest, source);
return (Action)Expression.Lambda(assign).Compile();
}
并尝试调用它,我得到一个异常告诉 Expression.Lambda 是 Func 类型(其中 T 是属性类型)
因为我调用了 assign,所以我希望堆栈上没有剩余值(因此不返回属性本身)。
现在如果我使用 SetMethod 分配属性,例如:
public static Action PropertyAssign(object sourceObject, object destObject, PropertyInfo sourceProperty, PropertyInfo destProperty)
{
Expression source = Expression.PropertyOrField(
Expression.Constant(sourceObject), sourceProperty.Name);
Expression dest = Expression.PropertyOrField(
Expression.Constant(destObject), destProperty.Name);
Expression assign = Expression.Call(
Expression.Constant(destObject), destProperty.SetMethod, source);
Action assigner = (Action)Expression.Lambda(assign).Compile();
return assigner;
}
在这种情况下,Lambda.Compile() 函数会按预期返回一个没有参数/返回值的 Action。
所以这不是一个阻塞问题,但我只是好奇为什么赋值运算符返回一个值以及分配属性(其中 Assign 应该也只是调用 setter 方法)。
还有一种方法可以让第一次调用返回一个 Action 而不是一个函数吗?
最佳答案
您遇到的问题是因为赋值运算符实际上是一个 Func
,而 setter 返回一个 void。
通常我实际上会避免使用 Expression.Lambda
正是因为这个问题(以及转换)。
试试这个。
public static Action PropertyAssign(object sourceObject, object destObject,
PropertyInfo sourceProperty, PropertyInfo destProperty)
{
Expression source = Expression.Property(
Expression.Constant(sourceObject), sourceProperty);
Expression dest = Expression.Property(
Expression.Constant(destObject), destProperty);
Expression assign = Expression.Assign(dest, source);
return Expression.Lambda<Action>(assign).Compile();
}
这不会对您希望 IL 返回的委托(delegate)类型产生任何歧义。
然而,这段特定的代码似乎完全没有意义,因为您无法重用生成的 IL。我建议您缓存它的参数化版本。
public delegate void Assign(TSource sourceObject, TDest destObject);
public static Assign PropertyAssign(TSource sourceObject, TDestdestObject,
PropertyInfo sourceProperty, PropertyInfo destProperty)
{
var sourceObjectExpression = Expression.Parameter(sourceObject);
var destPropertyExpression = Expression.Parameter(destProperty);
Expression source = Expression.Property(
sourceObjectExpression, sourceProperty);
Expression dest = Expression.Property(
destPropertyExpression, destProperty);
Expression assign = Expression.Assign(dest, source);
var lambda = Expression.Lambda<Assign>(
assign, sourceObjectExpression, destPropertyExpression);
return lambda.Compile();
}
关于c# - Expression.Assign 返回 Func 而不是 Action,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31408508/
在嵌入式系统的背景下,给出以下函数结构: 返回变量的条件赋值: int foo(int x) { int status; if (is_valid(x)) {
#input |--IDs-|--Value-| |--da1-|--100---| |--da2-|---80---| |--da3-|--200---| |--da4-|--300---| |--
您可以declare a list of variables and assign them some value在 Perl 6 my ($a, $b) = 33,44 # $a will be 3
在下面的代码中实现对象的浅拷贝,但是不同的输出让我很困惑: 对象.分配: var obj = { name: 'wsscat', age: 0, add: { a: 'beijin
我正在查看一位已不复存在的开发人员的一些旧代码,并注意到有时他使用 Object.assign({}, xyz) 还有他用过的其他东西 Object.assign([], abc); 两者有区别吗?
这个问题在这里已经有了答案: Why were ES5 Object methods not added to Object.prototype? (2 个答案) 关闭 4 个月前。 我正在做一个
我想知道这之间的区别: Object.assign(otherObject, { someNewProperty: '' }); 和 otherObject.someNewProperty = '
考虑以下代码: const defaultState = () => { return { profile: { id: '', displayName: '',
我刚刚偶然发现this line of TS code : const { title = item.text } = item; 这似乎是一个destructuring assigment但是大括号
我是一个没有经验的 JavaScript 用户,正在阅读这本书 CoffeeScript: Accelerated JavaScript Development ,其中作者制作了一种 Scrabble
当我查看日志文件时 D:\SAS\XXX\Lev1\SASMain\BatchServer\Logs 我看到了这两行 NOTE: Libref TESTLIB successfully assigne
我似乎不明白为什么要使用移动赋值运算符: CLASSA & operator=(CLASSA && other); //move assignment operator 结束了,复制赋值运算符: CL
在Eiffel Studio中,我一直试图访问从另一个类定义的一个类的对象的字段。但是,它不断给出我无法理解和解决的错误。以下是示例代码片段: 创建对象的类: class TEST1 feat
为什么这个片段在 Node (10.5) .then(function() { this = {...this, ...payload}; this.update();
我在我的 React 应用程序中使用以下包来生成 Recaptcha 组件:https://github.com/appleboy/react-recaptcha 组件如下所示,带有 eslint 警
我有以下代码: #include #include using std::cout; struct SomeType { SomeType() {} SomeType(const Some
我有这个代码示例: var a = 10; ({a}) = 0; 在 Google Chrome 中,它显示错误:SyntaxError:无效的解构赋值目标 在 Firefox 中,它显示错误:Ref
我有一个函数,用于对两个输入字段的输入求和并将其分配给一个。我的函数如下所示: function sum(id) { nextId = id+2 console.log
我收到这个警告 "Automatic Reference Counting Issue: Assigning retained object to unsafe_unretained variable
在使用 Shopify 的 Liquid 语言编码时,我注意到使用以下语法分配了一些变量: {%- assign variable = value -%} 和使用以下语法分配的其他变量: {% ass
我是一名优秀的程序员,十分优秀!