【问题标题】:Type casting of complex object in derived class派生类中复杂对象的类型转换
【发布时间】:2014-02-27 13:29:25
【问题描述】:

我有一些复杂的问题。而是它的奇怪但它的要求。我有两个不同的命名空间,它们都有相同的类结构。 namespace2 的 Class1 继承了 namespace1 的 class1。类的每个参数都属于其他类类型,并且每个类型都在各自的命名空间中,即 Type11 在命名空间 1 中,Type21 在命名空间 2 中(第一个数字表示命名空间)。现在在派生类构造函数中,我需要继承基类构造函数。为此,我需要将每个对象类型转换为其基类。但是当我对对象进行类型转换时。它显示类似“无法将 namespace1.Type21 转换为 namespace2.Type11”的错误

注意: namespace1 和 namespace2 都是不同的类库项目。我在 namespace2 项目中添加了 namesapce1 项目的引用。 Type11、Type21 等是类本身。

这里的每个类型(即 Type11、Type12 等)又是一个类,具有方法参数和其他一些复杂类型的属性。

这是我的示例代码。我试图复制我在现实中面临的相同场景。

namespace Namespace1
{
    public class TestClass1
    {
        private Type14 obj4;
        public Type15 obj5;
        public TestClass1()
        { 
        }

        public TestClass1(Type11 obj1)
        {
        }

        public TestClass1(Type11 obj1,Type12 obj2)
        {
        }

        public TestClass1(Type11 obj1,Type12 obj2,params Type13[] obj3) 
        {
        }
    }
}

namespace Namespace2
{
    public class TestClass1:Namespace1.TestClass1
    {
        private Type14 obj4;
        public Type15 obj5;

        public TestClass1():base()
        {  
        }

        public TestClass1(Type21 obj1):base((namespace1.Type11)obj1)
        {
        }

        public TestClass1(Type21 obj1,Type22 obj2):base((namespace1.Type11)obj1,(namespace1.Type12)obj2)
        {
        }

        public TestClass1(Type21 obj1,Type22 obj2,params Type23[] obj3):base((namespace1.Type11)obj1,(namespace1.Type12)obj2,(namespace1.Type13)obj3)
        {
        }
    }
}

谁能告诉我在这种情况下如何进行类型转换?

【问题讨论】:

    标签: c# asp.net inheritance constructor type-conversion


    【解决方案1】:

    据我所知,Type11Type21 不是同一类型层次结构的一部分(即,它们都不是另一个的基类)。

    在这种情况下,没有“默认”的类型转换方式。你有两个选择:

    1. 为类型编写转换器并调用它们进行转换。如果您无法更改类型的源代码,这是唯一的方法。
    2. 如果您有权访问源代码,请为类型编写转换运算符。

    假设您可以访问源代码,则类型的显式转换运算符可以编写如下:

    // Assuming Type11 and Type21 have the same Foo property
    // Add the following inside Type11
    public static explicit operator Type21(Type11 t)
    {
        return new Type21 { Foo = t.Foo };
    }
    

    然后您可以从 Type11 显式转换为 Type21:

    Type11 a = new Type11 { Foo = 123 };
    Type21 b = (Type21)a;
    

    您甚至可以通过将上面第一个示例中的explicit 替换为implicit 来编写隐式转换运算符,这样您就可以在没有显式转换的情况下进行分配:

    Type11 a = new Type11 { Foo = 123 };
    Type21 b = a;
    

    MSDN has more information on using conversion operators.

    【讨论】:

    • S 这里的每个类型(即 Type11、Type12 等)又是一个类,它具有一些其他复杂类型的方法参数和属性。
    猜你喜欢
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2010-11-01
    • 2011-04-06
    相关资源
    最近更新 更多