これは実際には 2 つの部分からなる質問です。
1. パラメータの型が異なる関数の配列を Array または IEnumerable に格納するにはどうすればよいですか
次のように動作するコードを書くことは可能ですか:
Func<object, bool> fObj = (o) => false;
Func<Animal, bool> fAni = (a) => false;
Func<Cat, bool> fCat = (c) => true;
var funcArray = new Function1Array<bool>(fObj, fAni, fCat);
Function1Array<T>
c# では一般的なワイルドカードが(params Func<?, T>[] funcs)
許可されていませんが、
2. 質問 1 を実行できると仮定すると、オブジェクトが関数のいずれかのパラメーターと同じ型であるかどうかを確認し、同じ型である場合はオブジェクトにキャストできますか?
例:
Cat myCat = new Cat();
funcArray.invokeFirstMatch(myCat); // Invokes fCat(myCat)
object myCat2 = new Cat(); // Declared as object instead of Cat
funcArray.invokeFirstMatch(myCat2); // Invokes fCat(myCat2)
Dog myDog = new Dog();
funcArray.invokeFirstMatch(myDog); // Invokes fObj(myDog)
私の推測では、この方法で関数の配列を格納する直接的な方法がないことを意味するFunc<Cat, bool>
サブタイプではないため、各関数を何らかの方法でラップしないと、両方の質問は不可能であると思います。Func<object, bool>