【发布时间】:2013-05-16 20:47:52
【问题描述】:
这真的是一个两部分的问题。
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> 采用 (params Func<?, T>[] funcs) 之类的东西,即使 c# 不允许通用通配符
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> 的子类型,这意味着没有直接的方法以这种方式存储函数数组。
【问题讨论】:
-
你想要的听起来像是多态性。
-
@MikeBantegui,是的,它很接近,但我更新了 #2 中的示例以显示差异。即使
myCat被声明为object...,我也希望能够运行正确的函数。我想我想要的是可以在运行时更改的更动态的多态性。 -
您考虑过使用 dlr 吗?
-
@Tejas,如果我错了,请纠正我,但 DLR 用于从 .Net 已支持的语言以外的语言导入功能,而不是用于修改 c# 功能。
-
不,可以使用DLR实现动态调度。 blogs.msdn.com/b/curth/archive/2008/11/15/…
标签: arrays c#-4.0 generics casting