替换函数 - 没有重载方法错误 C# - 试图删除字符串中的部分
Posted
技术标签:
【中文标题】替换函数 - 没有重载方法错误 C# - 试图删除字符串中的部分【英文标题】:Replace function - no overload method error C# - Trying to remove section in string 【发布时间】:2021-05-31 12:52:17 【问题描述】:我正在尝试从 JSON 创建 url。
从 JSON 接收的“输入”数据以 -sm 开头,我试图将其替换为“”(基本上将其删除)。
使用 Replace 函数时会出现无重载方法错误。如何避免这种情况,或者如何正确构建此代码以确保没有错误?我想从所有输入数据中删除 sm-。
到目前为止我的代码:
List<string> url = new List<string>();
//Loop which adds Input and signature to array
foreach (JObject item in jArray)
url.Add("https://" + (string)item.SelectToken("Input").Replace("sm-", "") + ".com/?sig=" + (string)item.SelectToken("signature"));
确切消息:CS1501 方法“替换”没有重载需要两个参数
【问题讨论】:
停止使用方法链并调试程序的每一步以了解发生了什么。 “框架 URL”是什么意思? 显然SelectToken
不返回String
值 - 或者它返回支持隐式转换为String
的非String
值。
请阅读How to Ask 并发布minimal reproducible example。还要发布确切的错误消息。是编译错误还是运行时错误?
我已将确切的消息添加到线程中
【参考方案1】:
(string)item.SelectToken("Input").Replace("sm-", "")
需要
((string)item.SelectToken("Input")).Replace("sm-", "")
您还可以将代码拆分为单独的语句,以便于查找问题和调试。
var urls = new List<string>();
var json = "[\"Input\": \"sm-a\", \"signature\":\"sig1\", \"Input\": \"sm-b\", \"signature\":\"sig2\" ]";
var jArray = JArray.Parse(json);
foreach (JObject item in jArray)
//Error handling missing
var inputToken = (string)item.SelectToken("Input");
var input = inputToken.Replace("sm-", "");
var signature = (string)item.SelectToken("signature");
urls.Add("https://" + input + ".com/?sig=" + signature);
//urls
//"https://a.com/?sig=sig1"
//"https://b.com/?sig=sig2"
【讨论】:
【参考方案2】:.SelectToken
方法返回 JToken
值,而不是 String
值。
JToken
类型String
值,这就是为什么您能够使用返回的JToken
值就像一个字符串JToken
类型仅支持隐式转换 from 字符串。在您的情况下,您的代码实际上是通过 +(String,Object)
运算符隐式调用 JToken.ToString()
。
但是,依赖隐式调用 JToken.ToString()
并不是一个好主意,因此请先检查 JToken.Type
- 您可以将其全部简化为一个 Linq 表达式:
List<string> urls = jArray
.Select( item => ( input: item.SelectToken( "Input" ), sig: item.SelectToken( "signature" ) ) )
.Where( t => t.input.Type == JTokenType.String && t.sig.Type == JTokenType.String )
.Select( t => ( input: (JValue)t.input, sig: (JValue)t.sig ) ) // `JTokenType.String` implies `jtoken is JValue`
.Select( t => ( input: t.input.ToString(), sig: t.sig.ToString() ) )
.Select( t => "https://" t.input + ".com/?sig=" + t.sig )
.ToList();
【讨论】:
将 JToken 转换为字符串是官方的:newtonsoft.com/json/help/html/QueryingLINQtoJSON.htm。另外,为什么不是一个好主意?这是一个json文本。所有标记都是字符串。它们可以变成别的东西,但它们都是内心的弦。 @tymtam 啊,我忘记了显式转换(尽管这与ToString()
相同,不是吗?)。无论如何,从JToken
到String
进行无条件转换的问题是 if JToken
是一个 JSON 对象,那么返回的字符串不应被视为字符串值将包含渲染的 JSON,它不应调用 Replace
,因为这可能会使 JSON 无效(例如,如果键名中有任何匹配项)。以上是关于替换函数 - 没有重载方法错误 C# - 试图删除字符串中的部分的主要内容,如果未能解决你的问题,请参考以下文章