在派生类中键入复杂对象的类型

时间:2014-02-27 13:29:25

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

我有点复杂的问题。相反它的奇怪但它的要求。我有两个不同的命名空间,它们都有相同的类结构。 namespace2的class1继承namespace1的class1。类的每个参数都是其他类类型,每个类型都在相应的名称空间中,即Type11在名称空间1中,Type21在namesapce 2中(第一个数字表示名称空间)。现在在派生类构造函数中,我需要继承到基类构造函数。为此,我需要将每个对象的类型转换为其基类。但是当我对该对象进行类型转换时。它显示错误,如'无法将namespace1.Type21转换为namespace2.Type11'

注意: namespace1和namespace2都是不同的类库项目。我在namespace2项目中添加了namesapce1项目的referance。 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)
        {
        }
    }
}

有谁能告诉我在这种情况下如何进行打字?

1 个答案:

答案 0 :(得分:3)

我收集的内容Type11Type21不属于同一类型层次结构(即,它们都不是另一个的基类)。

在这种情况下,没有“默认”方式来输入。您有两种选择:

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

    // 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.