使用NET Core 2.2,我有以下内容:
public class User {
public virtual IEnumerable<Claim> Claims { get; }
}
public class Claim {
public String Type { get; set; }
public String Value { get; set; }
}
我有一个方法FindAllClaims
的UserService:
public class UserService {
public IEnumerable<Claim> FindAllClaims(/* Some Filter */) {
}
}
我希望能够使用FindAllClaims
方法过滤声明:
User user = this.User;
user.FindAllClaims(x => x.Type == "sub");
我不确定执行此操作的最佳方法...
在Predicate<Claim>
方法中使用Func<Claim>
或FindAllClaims
吗?
我该怎么做?
答案 0 :(得分:3)
您可以使用
public IEnumerable<Claim> FindAllClaims(this IEnumerable<Claim> source, Expression<Predicate<Claim>> condition) {
return source.Where(condition)
}
或
public IEnumerable<Claim> FindAllClaims(this IEnumerable<Claim> source, Expression<Func<Claim,bool>> condition) {
return source.Where(condition)
}
答案 1 :(得分:3)
Predicate<T>
委托定义为
<sequence xmlns="http://ws.apache.org/ns/synapse" name="custom-sequence_name">
<property xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"
xmlns:ns3="http://org.apache.synapse/xsd"
name="accesstoken"
value="put your token here"
scope="transport"
type="STRING"/>
</sequence>
Func<T,TResult>
委托定义为
public delegate bool Predicate<in T>(T obj);
因此,public delegate TResult Func<in T,out TResult>(T arg);
等效于Func<T, bool>
。
话虽这么说,我将在这个问题上使用Predicate<T>
,因为它比Predicate
更好地传达了论点的意图。
但是请注意,Func
委托的TResult
被标记为Func
,因此,如果您使用引用类型,则可以返回实现{{ 1}}接口,或从out
类派生。
有关更多信息,请阅读Variance in Generic Type Parameters文档中的Variance in Delegates段落。