【问题标题】:Static extension for accessor访问器的静态扩展
【发布时间】:2013-09-27 07:47:38
【问题描述】:

我有很多类具有许多这样的属性:

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

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

【问题讨论】:

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


【解决方案1】:

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

给定以下代码:

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();

【讨论】:

  • null 不为空。不要违反方法的目的或意义。如果null 则抛出异常,或者只是将方法重命名为IsNullOrEmptyCollection
  • @SriramSakthivel:你是对的。我重命名了扩展方法
【解决方案2】:

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

可能是一个解决方案。我个人会选择多态解决方案:所以声明基类虚拟方法/属性就像我想要的那样,并从子类中调用它们。也因为扩展有利于扩展一些你无法以其他方式做的功能(不是你的库,你不允许接触的代码,第三部分库......)

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

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

但是有一个学习曲线。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2011-05-12
    相关资源
    最近更新 更多