询问者
关于Func<>的问题

问题
全部回复
-
这其实是.net 4.0中的逆变。假如classA能够转换为classB(classA继承classB),则调用void funcA(Func<classA, int> n)时参数可以是Func<classB, int>。方法内不会自动转换参数,在Func<classB, int>被调用时,传进去的参数仍然是classA(因为classA能够转换成classB,所以传classA给classB是合法的)。
关于逆变,可以参考:
http://msdn.microsoft.com/zh-cn/library/ms173174(VS.80).aspx
- 已编辑 lapheal 2014年4月22日 6:39
-
直接这样做确实不行。
不过可以通过lamda expression来实现。
- 已标记为答案 CaillenModerator 2014年5月4日 3:28
- 取消答案标记 CaillenModerator 2014年5月4日 3:31
-
你好:
可以把你的实现代码贴出来吗?这样可以帮助更多的人解决类似的问题。
非常感谢!
We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
Click HERE to participate the survey. -
classA和classB都包含成员a。
Expression<Func<classA, bool>> ExpressionA = (classA p) =>p.a.Equals(1);
var ExpressionParameterP = Expression.Parameter(typeof(classB), "p");
Expression<Func<classB, bool>> result = Expression.Lambda<Func<classB, bool>>
(FuncExpressionA.Body, ExpressionParameterP );这样,简单的Lambda表达式是可以转换的,但嵌套的貌似不行,如:
Expression<Func<classA,Expression<Func<classA, bool>>>> ExpressionA =(classA m)=> (classA p) =>p.a.Equals(m.a);
-
classA和classB都包含成员a。
Expression<Func<classA, bool>> ExpressionA = (classA p) =>p.a.Equals(1);
var ExpressionParameterP = Expression.Parameter(typeof(classB), "p");
Expression<Func<classB, bool>> result = Expression.Lambda<Func<classB, bool>>
(FuncExpressionA.Body, ExpressionParameterP );这样,简单的Lambda表达式是可以转换的,但嵌套的貌似不行,如:
Expression<Func<classA,Expression<Func<classA, bool>>>> ExpressionA =(classA m)=> (classA p) =>p.a.Equals(m.a);
请参考我给你回复的另外一个问题,如果classA和classB中都有相同的变量/属性/方法,可以使用dynamic类型来定义:
Func<dynamic, bool>
-