[英]Can I cast an unknown object to an interface so I can access its properties in C#?
我试图不重复代码,所以我有一个方法,可以快速转换接口的属性。
我有3个使用这个接口的具体类,我希望它们都可以使用这个方法。
当我从Session中获取其中一个对象时会出现问题。 我没有看到任何正确的方法。
public ActionResult GetItems()
{
details = (IHeader<IDetail>)Session["SelectedHeader"].Details // Throws invalid cast
return Json(details);
}
// My interface and class examples:
interface IHeader<T> where T: IDetail
{
IList<T> Details { get; set; }
}
class ConcreteHeader : IHeader<ConcreteDetail>
{
public IList<ConcreteDetail> Items { get; set; }
}
class ConcreteDetail : IDetail
{
...
}
我不能使用泛型,因为这是ASP.NET MVC 3中的一个动作方法(除非有一个技巧)。 这是可能的,还是我必须为每个类编写一个方法?
编辑:不确定原始问题是否清楚:
进入会话的是任何一个具体对象:
Session["SelectedHeader"] = new ConcreteHeader() { Details = new List<ConcreteDetail>() };
你需要用括号包装你的演员:
details = ((IHeader<IDetail>)Session["SelectedHeader"]).Details;
如果您使用的是.NET 4.0,只需使用dynamic
关键字进行转换,以确保正确的自动类型解析:
// note intellisense won't work when you use dynamic keyword...
var details = ((dynamic)Session["SelectedHeader"]).Details;
好像你刚刚遇到了共同和逆转的奇妙世界。 我写了一篇关于它的博客文章 ,试图尽可能简单地解释它。
结论:在.NET 4.0之前,您无法将IHeader<ConcreteDetail>
IHeader<IDetail>
为IHeader<IDetail>
。
从.NET 4.0开始,您可以使用in
和out
关键字来实现此目的。 您可以将接口定义为interface IHeader<out T>
。
如果您还没有使用.NET 4.0,可以通过创建一个新的lambda来解决这个问题:
details = () => Session["SelectedHeader"].Details;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.