C# 向可空类型添加方法

C# 向可空类型添加方法,c#,extension-methods,design-patterns,C#,Extension Methods,Design Patterns,我们遇到了一个场景,在这个场景中,我们需要跟踪可为空类型的设置和取消设置 大概是 int? value if(value.isSet()) { addTocollection(); } 我们还需要一个明确的功能 value.clear(); 其概念是数据有一个额外的状态,即设置状态 所以NULLset和NULLunset有不同的含义。 然后在大多数情况下都设置了值,最后一种情况下的值unset没有任何意义 是否有一种使用扩展方法或其他模式的方法可以解决这个问题。 我目前的想法是,我们必

我们遇到了一个场景,在这个场景中,我们需要跟踪可为空类型的设置和取消设置

大概是

int? value

if(value.isSet())
{
  addTocollection();
}
我们还需要一个明确的功能

value.clear();
其概念是数据有一个额外的状态,即设置状态

所以NULLset和NULLunset有不同的含义。 然后在大多数情况下都设置了值,最后一种情况下的值unset没有任何意义

是否有一种使用扩展方法或其他模式的方法可以解决这个问题。
我目前的想法是,我们必须恢复到某种类型的扩展类。

您可以使用扩展方法控制可为null的类型,即:添加方法以使用它,等等

然而,在某种程度上,当您开始向这样的对象添加行为时,对象本身确实开始感觉更像它应该在自己的类中。Nullable很好,因为它实际上仍然是一个值——只是一个可以为null的值。它本身仍然没有行为

如果您想添加自定义行为、过滤、事件跟踪等,那么我会考虑为这个自定义类型。

< P>这里是一个例子。

    public static class NullableInt32Extensions
    {
        public static Boolean IsSet(this Nullable<Int32> value)
        {
            return value.HasValue;
        }       
    }

我想知道你在找什么。我想这就像下面的转储是来自,想想Console.WriteLine。总的来说,我认为这不是一个好主意,因为您提供了一些模糊的东西,但并没有按照预期工作。除非我不明白你想要什么

void Main()
{
    int? x = null;
    var wrap = new NullableWrapper<int>( x );

    wrap.HasBeenSet.Dump();  // false
    wrap.HasValue.Dump();   // false

    wrap = 10;

    wrap.HasBeenSet.Dump();  // true
    wrap.HasValue.Dump();    // true
    wrap.Value.Dump();       // 10

    int? y = wrap;

    y.HasValue.Dump();   // True
    y.Value.Dump();      // 10

    wrap = null;
    wrap.HasBeenSet.Dump();  // Does now work like expected => bad
}

public class NullableWrapper<T> where T : struct
{
  private Nullable<T> _impl;
  private bool _hasBeenSet = false;

  public NullableWrapper( Nullable<T> t )
  {
    _impl = t;
    _hasBeenSet = t.HasValue;
  }

  public bool HasBeenSet
  {
    get { return _hasBeenSet; }
  }

  public bool HasValue
  {
    get { return _impl.HasValue; }
  }

  public T Value
  {
    get { return _impl.Value; }
    set { _impl = value; _hasBeenSet = true; }
  }

  public void Clear()
  {
    _hasBeenSet = false;
  }

  public static implicit operator Nullable<T>( NullableWrapper<T> lhs )
  {
    return lhs._impl;
  }

  public static implicit operator NullableWrapper<T>( T rhs )
  {
    return( new NullableWrapper<T>( rhs ) );
  }
}

你在找value.HasValue吗?@Bluephlame:另外,你不能创建一个扩展方法来改变可为null的int的值。这是一件好事。这在第二步就行不通了。你在一个扩展方法中按值传递一个值类型,所以你在清空一个副本。哈哈,我希望在任何人注意到之前进行一次重影编辑。这基本上就是我想要的,我认为包装器可以工作,如果我能使它易于使用的话。例如,是否有任何方法可以隐式转换NullableWrapper,例如。NullableWrapper wrap=123;这是更短的var wrap=Int.Createx,而不是=new nullablewrapper123;我希望这会好得多。这里是对@JP函数的重写。智力?x=零;var wrap=Int.Createx;对于类public class Int{private Int{}public static NullableWrapper Createint?x{return new NullableWrapperx;}}现在可以有一个更短的值。