访问者的静态扩展

时间:2013-09-27 07:47:39

标签: c# .net static extension-methods accessor

我有很多类,有很多这样的属性:

public AnyClass[] car
{
     get
     {
          return this.anyClassField;
     }
     set
     {
          this.anyClassField= value;
     }
}

在每个set {}访问器中,如果value为null,我需要设置isEmptyFlag = true。所以我想可能有可能以某种方式编写静态扩展来自动执行或者可能是另一种解决方案?

2 个答案:

答案 0 :(得分:2)

您可以创建一个通用扩展方法来检查数组是空还是空。

给出以下代码:

public class Foo
{
    private anyClass[] anyClassField;

    public anyClass[] car
    {
        get
        {
            return this.anyClassField;
        }
        set
        {
            this.anyClassField = value;
        }
    } 
}

public class anyClass
{
    // add properties here ....
}

您可以创建如下的扩展方法:

public static class CollectionExtensions
{
    public static bool IsNullOrEmptyCollection<T>(this T[] collection)
    {
        if (collection == null)
            return true;

        return collection.Length == 0;
    }
}

使用代码(不要忘记包含CollectionExtensions类的命名空间):

var foo = new Foo();

// returns true
bool isEmpty = foo.car.IsNullOrEmptyCollection();

// add 1 element to the array....
foo.car = new [] { new anyClass() };

// returns false
isEmpty = foo.car.IsNullOrEmptyCollection();

答案 1 :(得分:0)

静态扩展与类型结合使用。我不知道你的所有类是如何构造的,但即使它们都完美结构,你也需要手动为每个必须表现得像这样的属性的类添加代码。

可能是解决方案。我个人会寻求多态解决方案:因此声明基类虚拟方法/属性,它们就像我想要的那样,并从子类中调用它们。此外,因为扩展程序适用于扩展功能,而您无法以其他方式执行某些操作(不是您的库,您不允许触摸的代码,第三部分库...)

另一种解决方案可能是使用AOP(面向方面​​编程),例如形式示例:

Aspect Oriented Programing (AOP) solutions for C# (.Net) and their features

但是有一个学习曲线。