我正在尝试创建一个允许我检查对象属性的扩展。如果属性不等于我需要属性相等(或多个属性)的值,它将返回一个null对象。如果它相等,它将返回相同的对象。我的项目有很多地方必须在多个类和属性上完成,所以尽可能少的代码(除了支持代码的扩展)。
例如,我有一个具有Age属性的类。任何年龄超过55岁但不到60岁的人将返回null。任何55岁以下和60岁以上的年龄将返回该物体。
// Set the object of person to null, so we can error detect off of it later
var person = person.SOMEEXTNAME(p => p.Age >= 55 && p.Age <= 60);
// Returns a valid object of PERSON
var person = person.SOMEEXTNAME(p => p.Age < 55 || p.Age > 60);
我尝试了几种不同的方法,但似乎无法确定它。
任何帮助都会很棒。
答案 0 :(得分:2)
作为一个单行:
public static T NullOrDefaultIfFalse<T>(this T self, Func<T,bool> conditionFunc)
{
return conditionFunc(self) ? self : default(T);
}
用法:
var person = person.NullOrDefaultIfFalse(p => p.Age < 55 || p.Age > 60); //Takes advantage of type parameter inference
答案 1 :(得分:1)
public static TProperty? If<TProperty>(this TProperty propValue, Func<TProperty,Boolean> validator) {
return propValue != default(TProperty) && validator( propValue ) ?
propValue : default(TProperty);
}
这可以像这样使用:
class Person {
public Int32 Age;
}
////
Person p = new Person() { Age = 25; }
Int32? age = p.Age.If( pv => pv < 55 && pv > 60 );
请注意,处理引用类型和值类型会使其更复杂一些。如果您添加了泛型类型约束,则可以更容易理解。