在开发工具中,它显示如下类型:
IClass {Class23}
Run Code Online (Sandbox Code Playgroud)
在调试器中(运行时),它将其显示为以下类型:
Class23
Run Code Online (Sandbox Code Playgroud)
IClass并且Class23具有不同的属性,似乎我可以在它作为类型运行时访问它,但是当我尝试编码属性时它不会构建,Class23因为intellisense希望我输入属性IClass.有人可以解释这种行为以及我应该从Class23对象何时访问属性IClass {Class23}?
我试过这个,但它只返回null:
Class23 myclass = Function(returns IClass {Class23}) as Class23
Run Code Online (Sandbox Code Playgroud)
救命!
一些代码,不确定它是否有帮助:
Bucket Cats = Dictionary1["key1"] as Bucket;
IEnumerable<IClass> links = Cats.Links;
// this should actually be `Class23`
var Name = links.ElementAt(0).Name; //<--Error
Run Code Online (Sandbox Code Playgroud)
随着更新:
IEnumerable<IClass> links = Cats.Links;
// this should actually be `Class23`
var Name = links.ElementAt(0).Name; //<--Error
Run Code Online (Sandbox Code Playgroud)
这里的错误是你的期望.如果你有一个序列IClass,那么ElementAt(0) 返回一个IClass.你没有自动施法(除非你作弊,并且:不要).如果您知道该项目是a Class23,那么:
var Name = ((Class23)links.ElementAt(0)).Name; // could also use .First()
Run Code Online (Sandbox Code Playgroud)
您还可以使用:
IEnumerable<Class23> links = Cats.Links.Cast<Class23>();
Run Code Online (Sandbox Code Playgroud)
但是,坦率地说,我不认为你应该寻找的接口里面所有.如果它对于IClass公开它是有用的Name,那么添加Name到interface.
在开发工具中,它显示如下类型:
这听起来像"它"你指的是静态类型的作为IClass,并已提供的实例Class23恰好实现IClass.那很好也很正常 - 没有错(名字除外).但接口的整个的一点是,你不应该通常需要跟该类型的成员:您只需要通过接口公开的API.如果你需要更多:你已经打破了抽象.然而,有时候,是的 - 你需要打破抽象,例如某些方面的特殊情况.在这种情况下...演员:
IClass foo = ...
if(foo is Class23) {
var bar = (Class23)foo;
bar.SomeClassMember = 42;
}
Run Code Online (Sandbox Code Playgroud)