c# - 将对象变量中保存的字符串分配给动态 (C#) 的字符串属性

标签 c# dynamic c#-4.0 dynamic-language-runtime

我知道它有点啰嗦,可能无法完全理解。所以这是我正在尝试做的一个例子。

public class TypeWithString
{
    public string MyString { get; set; }
}

string s = "We Want Moshiach Now";
TypeWithString tws = new TypeWithString();
object o = s;
dynamic d = tws;
d.MyString = o;

此代码出人意料地生成错误 RuntimeBinderException: Cannot implicitly convert type 'object' to 'string'。 尽管 MyStringstring 类型并且 o 中保存的是 string

这是 DLR 中的错​​误还是缺陷?

有办法解决吗?

如果我提前不知道类型。但我知道它符合鸭子类型。即我知道它实现了一个不成文的接口(interface)。无论如何,当它们确实是正确的类型时,我可以将一个变量分配给另一个变量吗?

非常感谢

最佳答案

不,这是预期的。编译器知道o的类型是object,所以它记录了一个动态 Action “尝试找到一个名为MyString的属性,然后尝试为它分配一个 object 类型的值”——如果存在从 objectstring 的隐式转换,它可以这样做,但是没有吨。请注意,您的语句中唯一动态的部分是它的目标...因此这是唯一被动态处理的部分。在执行时,“执行时编译器”会有效地说,“d 值的实际类型是什么?啊,它是 TypeWithString...现在,如果我们有会发生什么:

TypeWithString tmpD = (TypeWithString) d;
tmpD.MyObject = o;

... 将会发生编译时错误。

如果您希望它在值中也表现得动态,只需使用 dynamic 而不是 object 作为您分配的值:

string s = "We Want Moshiach Now";
TypeWithString tws = new TypeWithString();
dynamic o = s;
dynamic d = tws;
d.MyString = o;

这一次,“执行时编译器”将询问自己 d o 值的实际类型,想象一下代码如下:

TypeWithString tmpD = (TypeWithString) d;
string tmpO = (string) o; // Actual type is string at execution time
tmpD.MyObject = tmpO;

关于c# - 将对象变量中保存的字符串分配给动态 (C#) 的字符串属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3161631/

相关文章:

jquery - 在页面的 ajax 加载部分上对 Video.js 播放器进行多次初始化

javascript - 更改 HTML 图像标签的 src 以使用 Javascript 从 url 加载图像

c# - 动态 COM 对象是否被视为托管资源?

c# - 如何在 asp.net C# 4.0 中调用异步方法?

c# - ASP.NET5 MVC6 的模型绑定(bind)问题

c++ - C++中数组的动态调整大小

c# - IIS 7.5 的 SignalR 性能

c#-4.0 - 使用在 C# 中执行的带有 TCP/IP 接口(interface)的 ESC/POS 命令直接打印到热敏打印机

c# - 使用 TreeView 在 WPF 中获取 XML 属性

c# - 使查询表达式忽略时间并仅过滤日期