C# 对具有接口的每个对象调用方法

C# 对具有接口的每个对象调用方法,c#,C#,好吧,假设我有一个接口电机 public interface Motor { void PressGas(); } 我有多个有马达接口的类 public class Car : Motor { public Car() {} public void PressGas() { //Press gas as car } } public class Plane : Motor { public Plane() {}

好吧,假设我有一个接口电机

public interface Motor 
{
    void PressGas();
}
我有多个有马达接口的类

public class Car : Motor
{
    public Car() {}
    public void PressGas() 
    { 
        //Press gas as car
    }
}


public class Plane : Motor
{
    public Plane() {}
    void PressGas() 
    {
        //Press gas as plane
    }
}
我创建了多个这样的对象

Plane plane1 = new Plane();
Plane plane2 = new Plane();
Car car1 = new Car();
Car car2 = new Car();

现在,我想使用该接口对拥有该接口的每个对象调用
PressGas()
。有没有一种方法可以在不将所有对象添加到列表并遍历列表的情况下执行此操作?

第一个问题是您需要类来继承接口:

public class Car : Motor
{
    public void PressGas() { }
}

public class Plane : Motor
{
    public void PressGas() { }
}
现在是棘手的部分,如果您不想使用
列表
,最简单的方法是创建一个方法:

public static void CallPressGas(params Motor[] motors)
{
    //Here you can iterate through them:
    foreach (var motor in motors)
        motor.PressGas();

    //Or if you wanted to use a list (even though you said you didn't)
    motors.ToList().ForEach(m => m.PressGas());
}
你可以这样称呼它:

CallPressGas(plane1, plane2, car1, car2);
作为一名飞行员,我在
Plane
中遇到了一个叫做
PressGas
的方法。首先,在C中,必须明确声明接口实现。不能仅仅因为存在匹配的签名(动态类型除外),就推断出它

其次,如果您不想创建类型列表,无论出于何种原因,您都可以使用反射来遍历类型字段。我只会把这当作最后的手段,或是一些怪事。此示例仅适用于字段

public class CompositionTest
{
    Plane plane1 = new Plane();
    Plane plane2 = new Plane();
    Car car1 = new Car();
    Car car2 = new Car();

    public CompositionTest()
    {

        var imotorFields = GetType().GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
            .Where(field => typeof(IMotor).IsAssignableFrom(field.FieldType));

        foreach (var field in imotorFields)
        {
            ((IMotor)field.GetValue(this)).PressGas();
        }
    }
}

public interface IMotor
{
    void PressGas();
}

public class Car : IMotor
{
    public Car() { }
    public void PressGas()
    {
        //Press gas as car
    }
}


public class Plane : IMotor
{
    public Plane() { }
    public void PressGas()
    {
        //Press gas as plane
    }
}

但是,您的两个类都没有实现
Motor
接口吗?除此之外,我甚至不完全确定你在问什么。你可能想试着用编辑来澄清,正如@maccettura所指出的,编辑会很好。但是,如果我没有弄错,您可以创建,例如,一个马达列表
list
。然后将实现Motor接口的所有对象添加到创建的列表中。然后你可以在列表中循环得到你想要的。这没有多大意义。您想要实现什么?最佳做法是在界面前面加上字母I。例如:iMotor如果在电机上调用
PressGas
,会发生什么?它应该是类似于加速的吗“他想在不保留物品清单的情况下做这件事。”@StevenB。我错过了,我更新了一个替代方案。