接口列表 - 继承的接口,一个IList<>

时间:2018-02-17 02:32:05

标签: c#

如果我有以下界面

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属性。

我如何实现这一目标?

3 个答案:

答案 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,则会打印出IBarIFoo属性。