我想创建一个可以在对象上调用的扩展方法。
返回值将由函数定义。
这样的事情:(这只是一个例子)
bool isMature= thePerson.Age.Apply<bool>(d => { if (d >18) return true;
return false;
})
这是扩展方法:
public static Tout Apply<Tout>(this Object obj, Func< Tout> f)
{
return f( );
}
错误:不兼容的匿名函数签名
我做错了什么?
答案 0 :(得分:6)
您的方法仅需Func<Tout>
- 这是一个 没有参数的函数,但返回值。
你的lambda表达式有一个参数(d
) - 看起来你假设它是一个整数。目前还不清楚你要做什么,但是如果你想在lambda表达式中使用一个参数,你将不得不将签名从Func<TResult>
更改为Func<TArg, TResult>
或类似的东西 - 并在调用中提供参数。
答案 1 :(得分:3)
如果您期望委托实例的输入是属性值,那么您需要更改扩展方法的定义以获取此参数:
public static TOut ToFunc<TProperty, TOut>(this TProperty obj, Func<TProperty, TOut> f)
{
return f(obj);
}
// Usage
bool isMature = thePerson.Age.ToFunc<int, bool>(d => d > 18);
无论问题是什么,似乎都是一种奇怪的方法。
答案 2 :(得分:2)
这是一个毫无意义的练习,devdigital已经回答了你的问题,但答案是什么用。
所以我可以编写代码,
var greaterThan18 = 20.ToFunc(n => n > 18);
但是,为什么我不写
var greaterThan18 = 20 > 18;
所获得的只是一层间接。
答案 3 :(得分:0)
我设法做了类似的事情:
public static Tout ToFunc<T,Tout>(this T obj, Func<T, Tout> f)
{
return f(obj);
}
调用是
var isMature = theperson.Age.ToFunc<int, bool>(i => i > 18);
但是,我讨厌每次都指定<int, bool>
但是感谢resharper - 提醒我 - 我可以调用它:
var isMature = theperson.Age.ToFunc(i => i > 18);
对于小事来说,它是一个很好的工具。 (虽然最好有一个bool属性,表示isMature
....但是....你知道,它很好。)