合并对象的属性以返回null或对象?

时间:2014-07-24 01:30:26

标签: c# linq

我正在尝试创建一个允许我检查对象属性的扩展。如果属性不等于我需要属性相等(或多个属性)的值,它将返回一个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);

我尝试了几种不同的方法,但似乎无法确定它。

任何帮助都会很棒。

2 个答案:

答案 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 );

请注意,处理引用类型和值类型会使其更复杂一些。如果您添加了泛型类型约束,则可以更容易理解。