2

我想创建一个可以在对象上调用的扩展方法。

返回值将由函数定义。

像这样的东西:(这只是一个例子

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( );
        }

错误:不兼容的匿名函数签名

我究竟做错了什么 ?

4

4 回答 4

7

您的方法只需要一个Func<Tout>- 这是一个不参数但返回一个值的函数。

您的 lambda 表达式有一个参数 ( d) - 看起来您假设它是一个整数。目前尚不清楚您要做什么,但如果您想在 lambda 表达式中使用参数,您将不得不将签名从Func<TResult>toFunc<TArg, TResult>或类似的东西更改 - 并在调用中提供一个参数。

于 2013-02-06T16:25:36.193 回答
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);

无论问题是什么,这似乎都是一种奇怪的方法。

于 2013-02-06T16:30:19.770 回答
2

这是一个毫无意义的练习,devdigital已经回答了你的问题,但答案有什么用。

这样我就可以写代码了

var greaterThan18 = 20.ToFunc(n => n > 18);

但是,我为什么不写

var greaterThan18 = 20 > 18;

所获得的只是一层间接性。

于 2013-02-06T17:03:40.910 回答
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....但是 ....你知道,它很好。)

于 2013-02-06T16:58:58.037 回答