【问题标题】:How to cast one compound custom type to another如何将一种复合自定义类型转换为另一种
【发布时间】:2012-05-24 16:43:24
【问题描述】:

我正在尝试为自定义类型编写一个转换器类——将一种类型(及其所有属性)转换为另一种具有匹配属性的类型。

当属性也是自定义类型而不是简单类型时,问题就出现了。
自定义类型都是相同的,只是它们位于同一解决方案中的不同命名空间中。
TypeTwo 对象是 Web 服务引用。

例如

public TypeOne ConvertToTypeTwo (TypeTwo typeTwo)
{
var typeOne = new TypeOne();
typeOne.property1 = typeTwo.property1; //no problem on simple types
typeOne.SubType = typeTwo.SubType; //problem!
...
}

我在上面一行得到的错误是:

错误 166 无法将类型“TypeTwo.SubType”隐式转换为“TypeOne.SubType”

我试过这样投射

typeOne.SubType = (TypeOne)typeTwo.SubType;

但是得到:

错误 167 无法将类型“TypeTwo.SubType”转换为“TypeOne.SubType”

就这样

typeOne.SubType = typeTwo.SubType as TypeOne;   

但是得到:

错误 168 无法通过引用将类型“TypeTwo.SubType”转换为“TypeOne.SubType” 转换,装箱转换,拆箱转换,包装 转换,或空类型转换

我不确定我还有哪些其他选择,或者我是否只是在做一些根本错误的事情。 有什么想法吗?

【问题讨论】:

    标签: c#


    【解决方案1】:

    你不能那样做。即使这两种类型具有完全相同相同的布局(相同类型的相同字段),您也不能从一种类型转换到另一种类型。这是不可能的。

    您需要做的是创建一个转换器(作为方法、单独的类或转换运算符),它可以从一种类型转换为另一种类型。

    【讨论】:

    • 谢谢。你的建议成功了。我为子类型编写了一个单独的转换器,然后只调用该方法而不是尝试不可能的转换。再次感谢!
    【解决方案2】:

    如果这两个子类型是不同的类型,您必须编写一个单独的转换器来在这两种类型之间进行转换。

    例如:

    public TypeOne ConvertToTypeTwo (TypeTwo typeTwo)
    {
        var typeOne = new TypeOne();
        typeOne.property1 = typeTwo.property1; //no problem on simple types
        typeOne.SubType = ConvertToTypeTwo(typeTwo.SubType); //problem!
    }
    
    public TypeOneSubtype ConvertToTypeTwo(TypeTwoSubType typeTwo)
    {
        var subOne = new TypeOneSubType;
        subOne.property1 = typeTwo.property1;
        // etc.
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-11
      • 2018-06-25
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多