c# - C#匿名对象作为参数不起作用
问题描述
https://dotnetfiddle.net/446j0U链接重现(在.net 4.7.2 上失败,不在.net core 上)
public class TEST {
static public void Main(string[] args)
{
var test = new { Text = "test", Slab = "slab"};
Console.WriteLine(test.Text); //outputs test
Console.WriteLine(TEST.TestMethod(test)); //outputs slab
}
static public string TestMethod(dynamic obj)
{
return obj.Slab;
}
}
在同一个函数中访问匿名对象工作正常,但是当我尝试在函数中传递它时出现异常
运行时异常(第 14 行):尝试通过方法 'DynamicClass.CallSite.Target(System.Runtime.CompilerServices.Closure, System.Runtime.CompilerServices.CallSite, System.Object)' 访问类型 '<>f__AnonymousType0`2'失败的。
堆栈跟踪:
[System.TypeAccessException:尝试通过方法'DynamicClass.CallSite.Target(System.Runtime.CompilerServices.Closure,System.Runtime.CompilerServices.CallSite,System.Object)'访问类型'<>f__AnonymousType0`2'失败。]在CallSite.Target(Closure , CallSite , Object ) at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,Tret](CallSite site, T0 arg0) at TEST.TestMethod(Object obj) :line 14 at TEST.Main(String[] args ) : 第 9 行
@RandRandom 编辑:
由于赏金期快结束了,我决定编辑这个问题。
到目前为止,给出的答案都未能真正回答手头的问题,只是给出了避免错误的方法。
OP 明确表示(在评论中)他知道变通方法并且目前正在使用变通方法。
这些问题仍然存在
- 为什么在 OPs setup 和 dotnetfiddle.net 上出现上述错误?
- 如果错误通过更新得到修复,那么 OP 需要更新什么?
- 在新的编译器/.Net 版本/Visual Studio 版本中解决了问题吗?
在这里回顾一下到目前为止 OP 的信息:
- VS 2017
- .Net 框架 4.8
解决方案
正如C# 文档所说:
匿名类型提供了一种方便的方法,可以将一组只读属性封装到单个对象中,而无需先显式定义类型。类型名称由编译器生成,在源代码级别不可用。每个属性的类型由编译器推断。
有两种明显的方法:
1)用预定义的替换匿名类型:
public class Container {
public string Test { get; set; }
public string Slab { get; set; }
}
public static void Main(string[] args) {
var test = new Container { Text = "test", Slab = "slab"};
Console.WriteLine(test.Text); //outputs test
Console.WriteLine(TestMethod(test)); //outputs slab
}
public static string TestMethod(dynamic obj) {
return obj.Slab;
}
这种方式限制您不使用匿名类型。但它会正常工作。
2) 或者如果您喜欢匿名类型,请使用 ExpandoObject 强制转换。
示例:https ://sebnilsson.com/blog/convert-c-anonymous-or-any-types-into-dynamic-expandoobject/
推荐阅读
- sql - 多对多关系的 SQL 连接
- javascript - 动画在预加载 CSS 和图像之前开始
- python - 在 sklearn 中使用 Leave-One-Out 交叉验证的 ROC 曲线
- docker - 如何在相同的heroku应用程序但不同的docker镜像中部署前端和后端
- c# - 我想将我的 Json 对象转换为自定义字符串以保存到数据库
- r - 将国家多边形添加到地图框
- python - 使用 kwargs(或 args)而不是简单的 dict 有什么好处?
- react-native - 如何在 redux 的动作上调用动作?
- c# - 将方法调用委托给另一个方法
- ruby - Cucumber ruby 如何使用 ParameterType 来转换给定的表达式?