- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个反射代码,用于创建 List<>
的实例(类型参数在运行时已知),并调用Add
方法向其添加一些值。我的代码片段是这样的:
// here is my type parameter
var genericType = typeof(MyRunTimeType);
// here is a list of my values
MyRunTimeType[] values = MyRunTimeValuesOfTypeMyRunTimeType();
// creating instance of List<>
var listType = typeof(List<>);
var listGenericType = listType.MakeGenericType(genericType);
var listInstance = Activator.CreateInstance(listGenericType);
// getting Add method and call it
var addMethod = listGenericType.GetMethod("Add", genericType);
foreach (var value invalues)
addMethod.Invoke(listInstance, new[] { value });
那么,您建议如何将此反射片段转换为表达式树?
更新:
嗯,我写了这个片段,它似乎无法工作:
public static Func<IEnumerable<object>, object> GetAndFillListMethod(Type genericType) {
var listType = typeof(List<>);
var listGenericType = listType.MakeGenericType(genericType);
var values = Expression.Parameter(typeof(IEnumerable<>).MakeGenericType(genericType), "values");
var ctor = listGenericType.GetConstructor(BindingFlags.Instance | BindingFlags.Public, null, new Type[0], null);
var instance = Expression.Parameter(listGenericType, "list");
var assign = Expression.Assign(instance, Expression.New(ctor));
var addMethod = listGenericType.GetMethod("AddRange", new[] { typeof(IEnumerable<>).MakeGenericType(genericType) });
var addCall = Expression.Call(instance, addMethod, new Expression[] { values });
var block = Expression.Block(
new[] { instance },
assign,
addCall,
Expression.Convert(instance, typeof(object))
);
return (Func<IEnumerable<object>, object>)Expression.Lambda(block, values).Compile();
}
但是,我收到此错误:
Unable to cast object of type
'System.Func`2[System.Collections.Generic.IEnumerable`1[System.String],System.Object]'
to type
'System.Func`2[System.Collections.Generic.IEnumerable`1[System.Object],System.Object]'.
请问有什么建议吗?
最佳答案
工作:
public static Func<IEnumerable<object>, object> GetAndFillListMethod(Type genericType)
{
var listType = typeof(List<>);
var listGenericType = listType.MakeGenericType(genericType);
var values = Expression.Parameter(typeof(IEnumerable<object>), "values");
var ctor = listGenericType.GetConstructor(BindingFlags.Instance | BindingFlags.Public, null, new Type[0], null);
// I prefer using Expression.Variable to Expression.Parameter
// for internal variables
var instance = Expression.Variable(listGenericType, "list");
var assign = Expression.Assign(instance, Expression.New(ctor));
var addMethod = listGenericType.GetMethod("AddRange", new[] { typeof(IEnumerable<>).MakeGenericType(genericType) });
// Enumerable.Cast<T>
var castMethod = typeof(Enumerable).GetMethod("Cast", new[] { typeof(IEnumerable) }).MakeGenericMethod(genericType);
// For the parameters there is a params Expression[], so no explicit array necessary
var castCall = Expression.Call(castMethod, values);
var addCall = Expression.Call(instance, addMethod, castCall);
var block = Expression.Block(
new[] { instance },
assign,
addCall,
Expression.Convert(instance, typeof(object))
);
return (Func<IEnumerable<object>, object>)Expression.Lambda(block, values).Compile();
}
您的问题在于您试图返回 Func<IEnumerable<object>, object>
但你的功能实际上是 Func<IEnumerable<T>, object>
。解决办法就是将参数设为 IEnumerable<object>
然后使用 Enumerable.Cast<T>
在传递到 AddRange
之前
我已经更改了Expression.Parameter
用于instance
到 Expression.Variable
...但这只是为了更清楚地表明它是一个变量,而不是一个参数。 Expression.Variable
生成的表达式树和 Expression.Parameter
是相同的(因为两个函数具有相同的代码)。使用它的上下文定义了它是参数还是变量。我又做了一个小改动:Expression.Call
不需要参数的显式数组初始化。
啊...请注意 Block
的最后一行可能是:
addCall,
instance
而不是
addCall,
Expression.Convert(instance, typeof(object))
因为任何引用类型都可以隐式转换为 object
.
关于c# - 从反射转向表达式树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35913495/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
如何让我的节点始终朝着它所面对的方向前进? float tilt = _motionManager.accelerometerData.acceleration.x; [_player runActi
我继承了一个基于 Java、基于 Web 的 7 年前的产品,其中包含大约 75 万行代码。正如预期的那样,考虑到它的年龄,它不是基于 Maven 的结构,. Maven 用于构建和发布应用程序。但是
既然新版本的 eclipse 已经发布了,我应该立即转向吗?如果我的插件在 Galileo 中工作,它也能在 indigo 中工作吗? 最佳答案 如果不尝试或研究特定插件提供商关于 Indigo 兼容
我有一个使用 html、css 和 jQuery 制作的静态应用程序。我现在将其导入到 Angular 2 中,但遇到了日期问题: // GET DATE let d = new Date(); le
我在 C# 中为我的 unity 项目创建了一个植绒算法。我试着关注 this example ,但问题是把所有东西放在一起,我无法推断。以下代码是我希望拥有一个领导者跟随植绒系统的一部分。 我在基本
我有一张这样的 table Index | FeatureType | FeatureExists 1 | BR | 0 1 | EI
我有一个拥有大约 60,000 名付费客户的网站,其中 3000 名使用 Windows XP + IE 8。我想要一个可以为我的所有客户提供服务的证书(或多证书解决方案)。问题是 SHA-1 已被弃
我正在尝试找出如何以不同的方式执行我的 JavaScript 回调。 我目前的回调风格,将回调传递给函数,函数调用回调。例如: 函数调用 doSomething(function(data){
我有一个适用于 Android 2.1 的应用程序,我想为 Android 2.2+ 的设备添加移动到 SD 的支持。 我添加了代码: 但是如果我让我的项目保持在sdk level 7以上,我会出
此代码附在相机上: transform.position += Input.GetAxis("Vertical") * transform.forward * mod; transform.posit
jQuery 是 javaScript 的框架。但是,我能够很好地使用 javaScript 进行编码。我不知道如何在 jQuery 中(重新)编码它! 从头开始学习 jQuery 是唯一的方法还是我
我将一些旧代码从另一个库移至 jQuery,并在此过程中破坏了一些其他代码。我认为 jQuery 实现其 .html 函数的方式让我很伤心。 以下部分是使用以下语法通过 AJAX 调用和成功函数生成的
我在网上搜索了一些不错的代码,突然间我碰到了一个,但是它已经在 Eclipse 中工作了,因为我没有 Eclipse(而且我也不打算安装它)我可以在我的 VS10 上正确编译它。问题是所有链接器引用都
我是 Scrum 团队的一名测试人员,试图自动化我们的测试回归集。 我们的前端是用 Java Angular 开发的,我们使用 Tosca 测试套件来自动化我们的测试集。我遇到的问题如下: 使用 To
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
SVG 图标与字体图标相比有一些优势:它们可以缩放以适应可变大小的容器元素,并且理论上您可以更改各个路径的颜色。我也喜欢我可以在 Inkscape 中轻松制作它们的事实:P 但我如何在 CSS 文件中
关于将 iOS 应用程序迁移到 Swift 3.0 的过程。我终于摆脱了(所有)语法错误。 不过,我似乎还有一个很大的问题。 以下是我在构建项目时在 Xcode 中得到的最终错误消息: 这里太长了,所
自从我开始编码以来,我就是一名 .NET 开发人员。我想学习 Win32 编程。需要关于从哪里开始的建议。学习 Win32 编程的最佳资源/书籍是什么。我知道一点“大学 C++”。 最佳答案 毫无疑问
在windows上用了10多年,如何迁移到*nix平台?哪种口味更容易处理,让我更舒服,然后也许我可以切换到更标准的 *nix 口味?我已经推迟了一段时间了。帮助我进行额外的推送。 最佳答案 Linu
我是一名优秀的程序员,十分优秀!