.NET中是否存在1值“类包装”类型?

时间:2017-04-12 20:45:02

标签: c# .net class struct wrapper

我正在处理现有的自定义集合类型。此时无法更改约束。

class CustomDict<TKey, TValue>
where TValue : class

我想使用结构类型(即bool)作为值。

是否有标准 .NET / CLR类型可以用作类周围的包装器,以便以下内容有效?

new CustomDict<string, Wrapper<bool>>(..)

隐式/显式转换会很整洁,但不是必需的。当然,创建一个自定义类是微不足道的 - 问题是关于[重新]使用公共/核心类类型。

2 个答案:

答案 0 :(得分:2)

我找到了这个Tuple类:

https://msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx

您可以使用Tuple<bool>作为TValue类型参数。只需致电Create即可创建一个实例,例如:

Tuple.Create(true)

答案 1 :(得分:0)

正如你所陈述的那样,这很容易做到。例如:

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;