.NET 中是否有 1 值 "class wrapper" 类型?
Is there a 1-value "class wrapper" type in .NET?
我正在处理现有的自定义集合类型。目前无法更改约束条件。
class CustomDict<TKey, TValue>
where TValue : class
我想使用结构类型(即 bool
)作为值。
是否有 standard .NET/CLR 类型可以用作 class-around-struct 包装器,使得以下内容有效?
new CustomDict<string, Wrapper<bool>>(..)
Implicit/explicit 转换会很好,但不是必需的。当然,创建自定义 class 是微不足道的 - 问题是关于 [重新] 使用 common/core class 类型。
我找到了这个 Tuple
class:
https://msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx
您可以使用 Tuple<bool>
作为 TValue
类型参数。只需调用 Create
来创建一个实例,例如:
Tuple.Create(true)
正如您自己所说,这很容易做到。例如:
public class StructWrapper<T> where T : struct
{
public T Value { get; private set; }
public StructWrapper(T val)
{
Value = val;
}
public static implicit operator T(StructWrapper<T> w)
{
return w.Value;
}
public static implicit operator StructWrapper<T>(T s)
{
return new StructWrapper<T>(s);
}
}
然后你可以这样做:
var bw = new StructWrapper<bool>(true);
并且由于隐式转换,您可以执行以下操作:
if (bw)
{
Console.WriteLine("True!");
}
它应该可以工作。
如果您需要/想要实现平等,您可以将其添加到 StructWrapper<T>
:
public override bool Equals(object obj)
{
if (obj is StructWrapper<T>)
{
return Value.Equals(((StructWrapper<T>)obj).Value);
}
return Value.Equals(obj);
}
public override int GetHashCode()
{
return Value.GetHashCode();
}
public static bool operator ==(StructWrapper<T> a, StructWrapper<T> b)
{
if (System.Object.ReferenceEquals(a, b))
{
return true;
}
if (((object)a == null) || ((object)b == null))
{
return false;
}
return a.Value.Equals(b.Value);
}
public static bool operator !=(StructWrapper<T> a, StructWrapper<T> b)
{
return !(a == b);
}
public static bool operator ==(StructWrapper<T> a, T b)
{
return a.Value.Equals(b);
}
public static bool operator !=(StructWrapper<T> a, T b)
{
return !(a == b);
}
public static bool operator ==(T b, StructWrapper<T> a)
{
return a.Value.Equals(b);
}
public static bool operator !=(T b, StructWrapper<T> a)
{
return !(a == b);
}
哪个会让你做这样的事情:
var isbwTrue = bw == true;
我正在处理现有的自定义集合类型。目前无法更改约束条件。
class CustomDict<TKey, TValue>
where TValue : class
我想使用结构类型(即 bool
)作为值。
是否有 standard .NET/CLR 类型可以用作 class-around-struct 包装器,使得以下内容有效?
new CustomDict<string, Wrapper<bool>>(..)
Implicit/explicit 转换会很好,但不是必需的。当然,创建自定义 class 是微不足道的 - 问题是关于 [重新] 使用 common/core class 类型。
我找到了这个 Tuple
class:
https://msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx
您可以使用 Tuple<bool>
作为 TValue
类型参数。只需调用 Create
来创建一个实例,例如:
Tuple.Create(true)
正如您自己所说,这很容易做到。例如:
public class StructWrapper<T> where T : struct
{
public T Value { get; private set; }
public StructWrapper(T val)
{
Value = val;
}
public static implicit operator T(StructWrapper<T> w)
{
return w.Value;
}
public static implicit operator StructWrapper<T>(T s)
{
return new StructWrapper<T>(s);
}
}
然后你可以这样做:
var bw = new StructWrapper<bool>(true);
并且由于隐式转换,您可以执行以下操作:
if (bw)
{
Console.WriteLine("True!");
}
它应该可以工作。
如果您需要/想要实现平等,您可以将其添加到 StructWrapper<T>
:
public override bool Equals(object obj)
{
if (obj is StructWrapper<T>)
{
return Value.Equals(((StructWrapper<T>)obj).Value);
}
return Value.Equals(obj);
}
public override int GetHashCode()
{
return Value.GetHashCode();
}
public static bool operator ==(StructWrapper<T> a, StructWrapper<T> b)
{
if (System.Object.ReferenceEquals(a, b))
{
return true;
}
if (((object)a == null) || ((object)b == null))
{
return false;
}
return a.Value.Equals(b.Value);
}
public static bool operator !=(StructWrapper<T> a, StructWrapper<T> b)
{
return !(a == b);
}
public static bool operator ==(StructWrapper<T> a, T b)
{
return a.Value.Equals(b);
}
public static bool operator !=(StructWrapper<T> a, T b)
{
return !(a == b);
}
public static bool operator ==(T b, StructWrapper<T> a)
{
return a.Value.Equals(b);
}
public static bool operator !=(T b, StructWrapper<T> a)
{
return !(a == b);
}
哪个会让你做这样的事情:
var isbwTrue = bw == true;