我将首先使用 Zip 函数创建对,然后改为处理对的集合。
var seq1 = new object[] { new Fish(), new FishFood(), new Horse(), new DogFood(), new Dog() };
var count = seq1.Length;
var foodSeq = seq1.Skip(1).Concat(new object[]{null});
var dinnerPairs = seq1.Zip(foodSeq, (eater, food) => Tuple.Create(eater as Animal, food as Food)).Where(t => t.Item1 != null);
var result = dinnerPairs.Select(t => t.Item1.Feed(t.Item2));
Animal 类的 Feed 方法将被每个动物覆盖。例如对于狗,它会在 null 的情况下返回 DogNotFed,在 DogFood 的情况下返回 DogFad,否则返回 DogBadFed。如果您有严格的命名约定,则可以使用反射动态创建这些类型。
public abstract class Animal
{
public abstract Animal Feed(Food food);
}
编辑:我如何想象 Feed 方法可以使用反射解决您的逻辑,但未经测试。
public Animal Feed(Food food)
{
var myType = this.GetType().FullName;
if (food == null) return GetNewObject(myType + "NotFed") as Animal;
if( food.GetType().FullName == myType+"Food") return GetNewObject(myType+"Fed") as Animal;
return GetNewObject(myType+"BadFed") as Animal;
}
public static object GetNewObject(string typeName)
{
try
{
var t = Type.GetType(typeName);
return t.GetConstructor(new Type[] { }).Invoke(new object[] { });
}
catch
{
return null;
}
}