C#中不兼容的匿名函数签名?
我想创建一个可以在对象上调用的扩展方法 返回值将由函数定义 类似这样的:(这只是一个例子)C#中不兼容的匿名函数签名?,c#,.net,C#,.net,我想创建一个可以在对象上调用的扩展方法 返回值将由函数定义 类似这样的:(这只是一个例子) bool ismusic=person.Age.Apply(d=>{if(d>18)返回true; 返回false; }) 下面是扩展方法: public static Tout Apply<Tout>(this Object obj, Func< Tout> f) { return f( ); } public
bool ismusic=person.Age.Apply(d=>{if(d>18)返回true;
返回false;
})
下面是扩展方法:
public static Tout Apply<Tout>(this Object obj, Func< Tout> f)
{
return f( );
}
publicstatictout-Apply(此对象对象对象,Funcf)
{
返回f();
}
错误:匿名函数签名不兼容
我做错了什么 您的方法只需要一个
Func
——这是一个不带参数但返回值的函数
您的lambda表达式有一个参数(
d
)-看起来您假设它是一个整数。不清楚您想做什么,但是如果您想在lambda表达式中使用参数,您必须将签名从Func
更改为Func
或类似的内容,并在调用中提供一个参数。如果您希望委托实例的输入是属性值,则需要更改扩展方法的定义以获取此参数:
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);
public static TOut ToFunc(此TProperty obj,Func f)
{
返回f(obj);
}
//用法
bool ismuture=个人年龄ToFunc(d=>d>18);
不管问题是什么,这似乎是一种奇怪的方法。我已经设法做到了以下几点:
public static Tout ToFunc<T,Tout>(this T obj, Func<T, Tout> f)
{
return f(obj);
}
不过,对于小事情来说,这是一个不错的选择。(虽然最好有一个bool属性,它将指示
isMature
…但是…你知道,这很好。)这是一个毫无意义的练习,回答了你的问题,但答案是什么用途
所以我可以写代码
var greaterThan18 = 20.ToFunc(n => n > 18);
但是,我为什么不写信呢
var greaterThan18 = 20 > 18;
所获得的只是一层间接性。Jon我希望能够通过扩展方法检索类型为
Tout
的值,该方法将应用于Tin
的任何类型。。。(而不是编写执行此逻辑的外部函数)。@RoyiNamir:您没有TIn
——请查看您的代码;哪儿也看不见。您可以将方法更改为具有两个泛型类型参数,但您需要这样做。。。然后可能会将值传递给委托。重要的是你要了解你现在得到了什么,以及为什么它不起作用。顺便说一句<代码>如果(x)返回true;否则返回false代码>简化为返回x
所以你的lambda可以写成d=>d>18
你想扩展Object
还是想要一个通用扩展?@code为什么要删除你的答案?因为我误解了这个问题。我以为你想返回一个Func
,而不是兜售者。但是返回一个TOut
我不清楚这个方法首先要实现什么,而仅仅调用f
@codesinf应该使用扩展方法的值来执行。我补充了一个答案。(您的解决方案确实回答了我的问题)。将方法重命名为Apply
。您没有转换为Func
。但是,您可以执行var isMature=person.age>18
,这样更好@是的。尽管这是一条实现功能的捷径,而不是一条实现功能的捷径,但请详述这条评论,你是在谈论副作用吗?正如Jodrell所说,使用此功能没有任何好处。这并不是说它不好,因为它很可能不会引起问题,它只是增加了额外的代码,额外的复杂性,并使程序变得更慢而没有任何好处。
var isMature = theperson.Age.ToFunc(i => i > 18);
var greaterThan18 = 20.ToFunc(n => n > 18);
var greaterThan18 = 20 > 18;