【发布时间】:2019-02-26 18:04:25
【问题描述】:
如果你运行 TestClass.Test() 你会得到一个 RuntimeBinderException。这一切都始于var str = DoSomething(obj); 隐式键入动态而不是字符串。有人可以解释这里发生了什么吗?为什么RequiresString(str); 有效?我知道你不能在动态对象上调用扩展方法,但这整件事对我来说有点肮脏和破碎。尽管存在明显的类型不匹配,但一切编译良好,然后在运行时失败。
public static class ExtensionTest
{
public static string ToJsonTest(this object x)
{
return string.Empty;
}
}
public static class TestClass
{
public static void Test()
{
dynamic obj = new ExpandoObject();
obj.var1 = "hello";
var str = DoSomething(obj);
var testObj = RequiresString(str);
var json = testObj.ToJsonTest();
}
public static string DoSomething(object x)
{
return string.Empty;
}
public static TestObj RequiresString(string x)
{
return new TestObj();
}
public class TestObj
{
public int Prop1 { get; set; }
}
}
【问题讨论】:
-
它很脏,我不确定这是否完全回答了您的问题,但这里有一个讨论扩展方法如何在 CLR 中工作以及为什么它们不与 DLR 一起使用的简介:stackoverflow.com/a/5313149/1186321
-
明确一点,对其他人来说,将上面的“str”声明修改为显式类型可以解决问题,即:文章 Vlad 中描述的“传染性动态类型”的
string str = DoSomething(obj);在评论中链接到他下面的答案。以防万一有人得出动态无用的结论——在这种情况下,不要使用 'var' 声明变量。
标签: c# dynamic implicit-typing