如果我有以下界面
public interface IFoo
{
bool Active {get; set;}
bool Name {get; set;}
}
public interface IBar:IFoo
{
int Number {get; set;}
}
我希望能够创建一个IList<>并且能够访问列表项中的Number属性并且类型为IBar(以及IFoo属性),并且当列表项为IFoo类型时访问IFoo属性。
我如何实现这一目标?
答案 0 :(得分:2)
假设您的IList
被声明为:
IList<IFoo> foos = new List<IFoo>();
只需检查某个给定元素是否属于某种类型,如果是,则执行强制转换,您就可以访问这些属性。
e.g。
foreach(IFoo element in foos){
if(element is IBar){
IBar bar = (IBar)element;
// access IBar properties
}
// access IFoo properties
}
或从C#7
开始,您可以使用模式匹配并将上述if
支票与演员表一起更改为:
if (element is IBar bar) { ... }
答案 1 :(得分:1)
我认为你想使用.OfType<>()
扩展方法
static void Main(string[] args)
{
var list=new List<IFoo>();
var numbers=list.OfType<IBar>().Select((bar) => bar.Number).ToArray();
}
答案 2 :(得分:0)
只要列表中的所有项都实现IFoo
(或从IFoo
派生的接口),您应该只需检查其类型并进行转换即可访问派生接口的其他属性
IList<IFoo> fooList;
// assign new concrete list to `fooList` here, then add items of type `IBar`, or any other
// objects that implement an interface that inherits from `IFoo`
foreach (IFoo item in fooList)
{
String propertiesLog = $"Active = {item.Active} | Name = {item.Name}";
IBar barItem = item as IBar;
if (barItem != null)
{
propertiesLog += $" | Number = {barItem.Number}";
}
Console.WriteLine(propertiesLog);
}
此示例遍历列表中的每个项目,并打印出其属性。如果该项只是实现IFoo
,它只打印出IFoo
属性。如果该项目为IBar
,则会打印出IBar
和IFoo
属性。