为什么这个对象类型会改变我

时间:2014-09-30 10:45:33

标签: c# asp.net

在开发工具中,它显示如下类型:

IClass {Class23}

在调试器中(运行时),它将其显示为以下类型:

Class23

IClassClass23具有不同的属性,似乎我可以在它作为类型运行时访问它,但是当我尝试为{{1}编写属性时,它不会构建因为intellisense要我输入Class23的属性。有人可以解释这种行为以及当对象为IClass时我应该如何从Class23访问属性?

我尝试了这个,但它只返回null:

IClass {Class23}

帮助!


一些代码,不确定它是否有帮助:

Class23 myclass = Function(returns IClass {Class23}) as Class23

1 个答案:

答案 0 :(得分:5)

随着更新:

IEnumerable<IClass> links = Cats.Links;

// this should actually be `Class23`
var Name = links.ElementAt(0).Name; //<--Error

这里的错误是您的期望。如果序列为IClass,则ElementAt(0) 会返回IClass 。你没有自动施法(除非你作弊,并且:不要)。如果您知道该项目是Class23,那么:

var Name = ((Class23)links.ElementAt(0)).Name; // could also use .First()

你也可以使用:

IEnumerable<Class23> links = Cats.Links.Cast<Class23>();
但是,坦率地说,我认为你不应该在界面中查看。如果IClass公开Name非常有用,那么Name添加到interface


  

在开发工具中,它显示如下类型:

听起来就像您所指的“它”被静态输入为IClass,并且已经提供了Class23的实例,恰好实现了{{} 1}}。那很好也很正常 - 没有错(名字除外)。但是接口的全部意义在于不应该通常需要与类型成员交谈:您应该只需要通过接口公开的API。如果你需要更多:你已经打破了抽象。然而,有时候,是的 - 你需要来打破抽象,例如某些方面的特殊情况。在这种情况下......演员:

IClass