我在尝试循环遍历数组时收到错误(无法将类型System.Array隐式转换为字符串)。我已经遵循了代码并且for循环带回了正确的值。
public static string[] name = new string[] { "Chris" };
public static void FindMergeFielsa(WordprocessingDocument WPDoc, Dictionary<string, Array> WordMergeFields)
{
foreach (var field in WPDoc.MainDocumentPart.Document.Body.Descendants<SimpleField>())
{
string[] instruction = field.Instruction.Value.Split(splitChar, StringSplitOptions.RemoveEmptyEntries);
if (instruction[0].ToLower().Equals("mergefield"))
{
string fieldname = instruction[1];
foreach (var fieldtext in field.Descendants<Text>())
{
if (fieldtext.InnerText =="«_skils»")
{
//TODO
}
else
{
for (int i = 0; i < name.Length; i++)
{
string value = name[i];
//ERORR HERE Keeps Changing Value of Name "Chris" to system.string[] when put .ToString()
value = WordMergeFields.ContainsKey(fieldname) ? WordMergeFields[fieldname] : null;
if (value != null)
{
fieldtext.Text = value;
}
}
}
}
}
}
}
例外情况发生在
value = WordMergeFields.ContainsKey(fieldname) ? WordMergeFields[fieldname] : null;
我试图将WordMergeFields [fieldname]转换为字符串,但是当发生这种情况时,它会显示带有此代码连接到它的单词template的名称,调出System.String [],其中名称“chris”应为。我只是想知道如何解决转换类型system.array到字符串的问题。感谢您提供的任何帮助
答案 0 :(得分:6)
这是因为WordMergeFields
是Dictionary<string, Array> WordMergeFields
。
WordMergeFields[fieldname]
将返回一个数组。
您是不是要将其声明为值类型为string
的字典?
Dictionary<string, string> WordMergeFields
答案 1 :(得分:1)
根据方法签名,WordMergeFields
的类型为Dictionary<string, Array>
。所以这个:
WordMergeFields[fieldname]
的类型为Array
。您正在尝试将Array
设置为string
:
value = WordMergeFields[fieldname]
因此错误。也许你想要WordMergeFields
的第一个元素?也许WordMergeFields
应该是字符串而不是数组的字典?很难理解这段代码的作用,所以我无法确定。
我猜测后者,根据你在哪里展示用法的评论:
WordMergeFields.Add("Name", name);
假设单词name
的上下文中的值为string
,那么您可能认为WordMergeFields
为:
Dictionary<string, string>
请注意,string
可以隐式转换为Array
,因为它是一个字符数组。因此,您的使用在一个方向上工作(将字符串设置为数组)但在另一个方向上不工作(将数组设置为字符串),主要是巧合而不是您自己的设计。
将类型更改为Dictionary<string, string>
,它应该有效,至少在我们看到的内容中是这样。
答案 2 :(得分:0)
如果要将Array显式转换为字符串,则应对此进行编码。
value = WordMergeFields.ContainsKey(fieldname) ? WordMergeFields[fieldname] : null;
替换为
if(WordMergeFields.ContainsKey(fieldname) )
value = WordMergeFields[fieldname].FirstOrDefault();