繁体   English   中英

我可以将未知对象转换为接口,以便可以在C#中访问其属性吗?

[英]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开始,您可以使用inout关键字来实现此目的。 您可以将接口定义为interface IHeader<out T>

如果您还没有使用.NET 4.0,可以通过创建一个新的lambda来解决这个问题:

details = () => Session["SelectedHeader"].Details;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM