0

我有两个班级 ClassA 和 CLassB。ClassA 是一个抽象类。ClassB 派生自 ClassA。我有一个名为 ParentDTO 的 DTO。

public class ParentDTO
{
    public int UserId { get; set; }
}

public abstract class ClassA
{
    public abstract void CreateUser(ParentDTO dto);
}

public class ClassB : ClassA
{
    public override void CreateUser(ParentDTO dto)
    {
        Console.WriteLine("You are in class ClassB");
    }
}

现在我有一个 DTO(MyDTO),它源自 ParentDTO。

public class MyDTO: ParentDTO
{
    public int MyID { get; set; }
}

我进一步扩展了 ClassB:

public class ClassC : ClassB
{
    public override void CreateUser(ParentDTO dto)
    {
        var mydto = (MyDTO) dto;// This throws cast exception
        mydto.MyID=222;
    }
}

我将上面的代码用作:

    ClassC c = new ClassC();
    ParentDTO dto=new ParentDTO();
    c.CreateUser(dto);

有人可以告诉我如何在 ClassC 的 CreateUser 方法中投射 DTO。我想在我的代码中使用 mydto.MyID。我知道我正在做一些事情,比如将 Animal 转换为 Lion 而不是将 Lion 转换为 Animal。但是有什么方法可以使用子 DTO ID 吗?有人可以告诉我我做错了什么吗?

4

5 回答 5

1

您只是以错误的方式使用界面架构。添加 get,设置为 ParentDTO 类。

于 2012-08-31T13:16:04.790 回答
0

除非将父类型变量初始化为子类型(或从子类型派生的其他类型),否则您不能将父类型变量强制转换为子类型。

ClassC c = new ClassC();
ParentDTO dto = new MyDTO();
c.CreateUser(dto);
于 2012-08-31T13:04:15.307 回答
0

您创建了 class 的实例ParentDTO。将其强制转换为MyDTO正确会产生此异常,因为实例实际上是 typeParentDTO而不是 type MyDTO
您在那里拥有的对象实例没有带有 name 的属性MyID,它根本不存在,因此无法获得该值 - 不存在 - 值。

也许你应该描述你想要达到的目标。

于 2012-08-31T13:06:45.417 回答
0

有人可以告诉我如何在 ClassC 的 CreateUser 方法中投射 DTO

没门。您在声明中使用基类型创建了基类型的对象。您不能将其转换为派生类型,这是非法的。采用

ParentDTO dto=new MyDto();

这个

于 2012-08-31T13:12:22.310 回答
0

其他答案是正确的,但是通过更好地理解“静态类型”和“运行时类型”之间的区别,这种行为的原因会更清楚,他们没有讨论。静态类型是 C# 代码中变量的类型,而运行时类型是内存中实际对象的类型。

我们都知道静态类型和运行时类型可能不同。考虑:

class A { }
class B : A { }

A a = new B();

变量a引用类型的实例B。变量的静态类型是A,但对象的运行时类型是B

我们也可以认为a持有类型 A 的引用,该引用指向类型 B 的实例。当且仅当类型 B 派生自(或等于)类型 A 时才允许这样做。

因此,以下情况是不允许的:

B b = new A();

在这里,您试图将对类型 A(运行时类型)的实例的引用分配给(静态)类型 B 的变量。A 不是派生自或等于 B,因此不允许分配。同样,不允许进行以下分配:

string s = new object();
MyDTO dto = new ParentDTO();

强制转换运算符使事情有些复杂,但根本问题是相同的:您试图将引用设置为指向其运行时类型不是派生自或等于引用的静态类型的对象:

A a1 = new A();
B b1 = new B();

A a2 = (A)b1;  // fine, because B is derived from A
B b2 = (B)a1;  // not allowed, because A is not derived from B.

object同样,如果我们替换Astring,这可能更有意义B

object a1 = new object();
string b1 = "Hello, World!";

object a2 = (object)b1;  // a2 now points to the string "Hello, World!";
string b2 = (string)a1;  // cast fails: the string variable can't point to an instance of `object`

同样,对于您的类型:

ParentDTO a1 = new ParentDTO();
MyDTO     b1 = new MyDTO();

ParentDTO a2 = (ParentDTO)b1;  // works
MyDTO     b2 = (MyDTO)a1;;     // doesn't
于 2012-08-31T14:02:24.697 回答