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;}}现在可以有一个更短的值。