【发布时间】:2016-10-06 10:32:11
【问题描述】:
考虑以下代码:
public interface IStuff<T>
{
IList<T> Items { get; set; }
bool IsExpanded { get; set; }
}
public interface IBar
{
string Name { get; set; }
}
public interface IFoo : IBar, IStuff<IBar>
{
}
public class MyClass : IFoo
{
public Name {get;set;
public IList<IBar> Items { get; set;}
bool IsExpanded { get; set; }
}
当我使用它时,我实际上要做的是用IFoo 的实例填充MyClass.Items,这是允许的,因为IFoo 实现了IBar,所以一切都很好。
但是,我在控件中使用了一种方法,该方法不知道也不应该知道IBar。只需要知道IStuff<>具体有一个列表和一个属性。
当我使用Items 时,我将检测该项目是否像这样实现IStuff。
public void ProcessItems( object item )
{
IStuff<object> stuff = item as IStuff<object>;
stuff.IsExpanded = true;
foreach( var childItem in stuff.items )
{
ProcessItems( childItem );
}
}
这里的问题是,转换为IStuff<object> 现在不起作用,它返回 null。
我想做的只是使用接口的通用部分,我不在乎T 是什么。
问题是如何替换
IStuff<object> stuff = item as IStuff<object>;
以便我可以使用IStuff<> 接口中声明的项目?
【问题讨论】:
-
也许你应该把你的接口分成两个,一个是通用版本,一个是非通用版本,其中通用版本继承自非通用版本。然后你可以在不知道
<T>的情况下使用这些对象,但当然你只能访问不需要T的东西。 -
@HimBromBeere 为您解决了这个问题。
标签: c# generics reflection interface