为什么dynamic.ToString()在字符串而不是字符串之间返回某些内容?

编程入门 行业动态 更新时间:2024-10-25 06:30:49
本文介绍了为什么dynamic.ToString()在字符串而不是字符串之间返回某些内容?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我使用从 DynamicObject 派生的类型作为某些字符串的构建器。最后,我致电 ToString 以获得最终结果。

I use a type derived from a DynamicObject as a builder for some strings. At the end I call ToString to get the final result.

在这一点上,我认为这会给我一个正常的字符串,但是这个字符串有点奇怪。当我在其上使用字符串函数时,它的行为就像一个,但实际上却不知道是什么,既不是字符串也不是动态的。

At this point I thought it would give me a normal string but this string is somehow strange. It behaves like one when I use string functions on it but it behaves like I don't know actually what, something neither a string nor a dynamic.

这是我在生成器上实现 ToString 的方式

This is how I implemented ToString on my builder

public class Example : DynamicObject { public override bool TryConvert(ConvertBinder binder, out object result) { if (binder.ReturnType == typeof(string)) { result = ToString(); return true; } result = null; return false; } public override string ToString() { return base.ToString(); } }

当我这样运行时

dynamic example = new Example(); Console.WriteLine(example.ToString().ToUpper());

结果正确: USERQUERY + EXAMPLE (在LINQPad中执行时)

the result is correct: USERQUERY+EXAMPLE (when executed in LINQPad)

但是如果我这样叫第二行

However if I call the second line like this

Console.WriteLine(example.ToString().Extension());

其中

static class Extensions { public static string Extension(this string str) { return str.ToUpper(); } }

应用程序因而崩溃RuntimeBinderException 说

字符串不包含扩展的定义

'string' does not contain a definition for 'Extension'

但是如果我强制转换结果,它将再次起作用

but if I cast the result it works again

Console.WriteLine(((string)example.ToString()).Extension());

也许还有一个例子。

Maybe one more example.

Console.WriteLine((string)example); // UserQuery+Example

但是

Console.WriteLine(example); // DynamicObject UserQuery+Example

实际上,在转换之前,您永远无法确定会得到什么

You can actually never be sure what you'll get until you cast it to string.

为什么会这样,有没有办法避免额外的转换并以某种方式获取真正的字符串?

Why is this happening and is there a way to avoid the additional cast and get somehow a real string?

推荐答案

这是因为调用了 ToString 键入 dynamic 返回 dynamic 而不返回 string :

That's because ToString called on dynamic is typed to return dynamic and not string:

dynamic example = new Example(); // test will be typed as dynamic var test = example.ToString();

当您在<$ c上呼叫 ToUpper 时$ c> test 它将使用动态绑定并在运行时解析为 string.ToUpper 。您必须将具体类型转换为转义动态类型。

When you call ToUpper on test it will use dynamic binding and resolve to string.ToUpper at runtime. You have to cast to a concrete type to escape dynamic typing.

扩展方法是编译时功能,因此 dynamic 不输入扩展名,因此不支持方法。您仍然可以使用常规的静态方法调用语法来调用它。

Extension methods is a compile-time feature and as such is not supported by dynamic typing as extension method. You can still call it using regular static method invocation syntax.

Extensions.Extension(example.ToString());

但是再次- example.ToString()将返回 dynamic 并在运行时进行类型绑定,以检查它是否可以用作 Extensions.Extension 的参数呼叫。查看此答案以了解详细信息。

But again - example.ToString() will return dynamic and type binding will happen at runtime to check if it can be used as a parameter to Extensions.Extension call. Check this answer for details.

更多推荐

为什么dynamic.ToString()在字符串而不是字符串之间返回某些内容?

本文发布于:2023-11-06 09:52:16,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1563365.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:字符串   而不是   内容   dynamic   ToString

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!