无法将“TextmlBatchDeleteDocument”类型的对象强制转换为“System.String”

时间:2011-02-01 21:36:00

标签: c# casting

我遇到了一个我以前从未遇到类型转换的问题。

我正在尝试将TextmlBatchDeleteDocument类型的对象强制转换为System.String,因此我实现了一个显式类型转换运算符来处理完成此操作。

public override string ToString()
{
    return string.Format("{0}{1}", this.Collection, this.Name);
}

public static explicit operator string(TextmlBatchDeleteDocument doc)
{
    return doc.ToString();
}

成功,以下工作。

TextmlBatchDeleteDocument doc = new TextmlBatchDeleteDocument("name", "/collection/");
string someString = (string)doc;

但是我将List<TextmlBatchDeleteDocument>类型的对象传递给第三方函数,该函数需要一个对象来实现IList,并且它最终将使用列表中的对象作为字符串。这是我遇到麻烦的地方。每当我尝试调用第三方函数时,我都会收到此异常。

  

无法将“NWDA_Common.Textml.TextmlBatchDeleteDocument”类型的对象强制转换为“System.String”。

如果我的假设是正确的,我将函数传递给List<TextmlBatchDeleteDocument>类型的对象,但它会被转换为IList,然后会将列表中的任何对象视为基类型System.Object 。我做了一个测试来证实这个理论并得到了同样的例外。如果我首先将List<TextmlBatchDeleteDocument>类型的对象转换为System.Object,然后尝试对字符串进行强制转换,它会抛出异常。

TextmlBatchDeleteDocument doc = new TextmlBatchDeleteDocument("name", "/collection/");
object docAsObj = doc;
string someString = (string)docAsObj;

有没有人知道如何解决这个问题,还是我坚持重新分解并找到另一种方式?

1 个答案:

答案 0 :(得分:4)

听起来第三方组件真的需要一个IList,其中每个元素都是一个字符串 - 这就是你需要提供它的东西。转换不是多态应用的 - 它是基于源表达式的编译时类型的编译时选择。

基本上,您需要自己为每个元素执行转换,并将转换后的项目列表传递给第三方代码。