替换函数 - 没有重载方法错误 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() 相同,不是吗?)。无论如何,从JTokenString 进行无条件转换的问题是 if JToken 是一个 JSON 对象,那么返回的字符串不应被视为字符串值将包含渲染的 JSON,它不应调用 Replace,因为这可能会使 JSON 无效(例如,如果键名中有任何匹配项)。

以上是关于替换函数 - 没有重载方法错误 C# - 试图删除字符串中的部分的主要内容,如果未能解决你的问题,请参考以下文章

c#错误 1 “Graphics”方法没有采用“0”个参数的重载 ,z这是为啥呢

在C#中,关于重载方法的说法正确的是(D)。 (选择一项)

C#视频方法重载函数重载传值

UG NX二次开发(C#)-装配-删除阵列矩阵

UG NX二次开发(C#)-装配-删除阵列矩阵

C#方法重载和泛型接口