【发布时间】:2015-10-13 19:02:44
【问题描述】:
更新: 我正在尝试编写一种方法来完成某些工作,并且在它实际完成这些工作之前,它需要经过一些验证。这些验证因它要执行的工作而异。
经过一番思考,我仍然想使用相同的模式,并稍作改动。 现在,我想让以下代码工作:
SomeClass:
public SomeResponse DoSomething<T>(params Func<T, bool>[] validations)
{
if(validations.All(v=>v(T))
{
some logic..
}
return SomeResponse;
}
用法:
private Func<SomeRequest, bool> ValidateName = r =>
{return !string.IsNullOrWhiteSpace(r.Name);};
private Func<SomeRequest, bool> ValidatePhone = r =>
{return !string.IsNullOrWhiteSpace(r.Phone);};
var someResponse = SomeClass.DoSomething<SomeRequest>(ValidateName,ValidatePhone);
再一次,代码目前不起作用,因为它给了我错误
if(validations.All(v=>v(T))
基本上Type参数在这里无效,我找不到将实际SomeRequest对象传递给Func的方法。
我应该如何编写代码循环遍历函数列表返回的所有结果并确保它们返回true,以及保持Type参数的灵活性?
答案:
找到了一种方法,希望对您有所帮助:
只需将方法定义修改为:
某类:
public SomeResponse DoSomething<T>(T request, params Func<T, bool>[] validations)
{
if(validations.All(v=>v(request))
{
some logic..
}
return SomeResponse;
}
然后像这样使用它:
var someResponse = SomeClass.DoSomething<SomeRequest>(someRequest, ValidateName,ValidatePhone);
如果有其他解决方案,请告诉我。
【问题讨论】:
-
您不能将
Func<NameRequest, bool>或Func<PhoneRequest, bool>转换为Func<Request, bool>。Func<in T, out TResult>第一个类型参数逆变。
标签: c# parameter-passing func type-parameter