I have a program that is interfacing with an external library that, among other things, has an unsigned 12-bit value packed in a larger struct.
This used to be 8 bit
Try this (this example shows a custom Int64 type)
public class MyCustomInt64 : CustomValueType
{
private MyCustomInt64(long value) : base(value) {}
public static implicit operator MyCustomInt64(long value) { return new MyCustomInt64(value); }
public static implicit operator long(MyCustomInt64 custom) { return custom._value; }
}
Implement what you like in the constructor to apply constriants.
Usage
MyCustomInt64 myInt = 27; //use as like any other value type
And here is the reusable base custom value type (add more operators if needed)
public class CustomValueType
{
protected readonly TValue _value;
public CustomValueType(TValue value)
{
_value = value;
}
public override string ToString()
{
return _value.ToString();
}
public static bool operator <(CustomValueType a, CustomValueType b)
{
return Comparer.Default.Compare(a._value, b._value) < 0;
}
public static bool operator >(CustomValueType a, CustomValueType b)
{
return !(a < b);
}
public static bool operator <=(CustomValueType a, CustomValueType b)
{
return (a < b) || (a == b);
}
public static bool operator >=(CustomValueType a, CustomValueType b)
{
return (a > b) || (a == b);
}
public static bool operator ==(CustomValueType a, CustomValueType b)
{
return a.Equals((object)b);
}
public static bool operator !=(CustomValueType a, CustomValueType b)
{
return !(a == b);
}
public static TCustom operator +(CustomValueType a, CustomValueType b)
{
return (dynamic) a._value + b._value;
}
public static TCustom operator -(CustomValueType a, CustomValueType b)
{
return ((dynamic) a._value - b._value);
}
protected bool Equals(CustomValueType other)
{
return EqualityComparer.Default.Equals(_value, other._value);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((CustomValueType)obj);
}
public override int GetHashCode()
{
return EqualityComparer.Default.GetHashCode(_value);
}
}