I would like to greatly reduce verbosity of following code fragment.
What I'd like to do:
- Reduce number of occurrences of
MaterialRangedParam<Value>andMaterialParam<Value>. C++ has typedef. C# doesn't. Is there keyword for own type of a class? - Remove
operator !=,operator ==,GetHashCodeandEqualsand make compiler generate them for me (the way C++ would do it).
How can I do that?
Additional info:
I'm already aware that clone method offers functionality similar to ICloneable. I have no need to support ICLoneable at the moment.
Usage pattern:
Those items are going to be stuffed into several lists, arrays and hashtables, compared to each other, assign is going to be called often.
Advice?
public class MaterialParam<Value> where Value: System.IEquatable<Value>{
public string name = "";
public string shaderValueName = "";
public Value value;// = Value();
public void assignFrom(MaterialParam<Value> other){
name = other.name;
shaderValueName = other.shaderValueName;
value = other.value;
}
public MaterialParam<Value> clone(){
var result = new MaterialParam<Value>();
result.assignFrom(this);
return result;
}
public override bool Equals(object obj){
if(!(obj is MaterialParam<Value>))
return false;
MaterialParam<Value> other = (MaterialParam<Value>)obj;
if((System.Object)other == null){
return false;
}
return (this.name == other.name) &&
(this.shaderValueName == other.shaderValueName) &&
(this.value.Equals(other.value));
}
public override int GetHashCode(){
return name.GetHashCode() ^ shaderValueName.GetHashCode()
^ value.GetHashCode();
}
public static bool operator !=(MaterialParam<Value> a, MaterialParam<Value> b){
return !(a == b);
}
public static bool operator ==(MaterialParam<Value> a, MaterialParam<Value> b){
return a.Equals(b);
}
};
public class MaterialRangedParam<Value>: MaterialParam<Value> where Value: System.IEquatable<Value>{
public Value minValue;// = Value();
public Value maxValue;// = Value();
public void assignFrom(MaterialRangedParam<Value> other){
base.assignFrom(other);
minValue = other.minValue;
maxValue = other.maxValue;
}
new public MaterialRangedParam<Value> clone(){
var result = new MaterialRangedParam<Value>();
result.assignFrom(this);
return result;
}
public override bool Equals(object obj){
if (!base.Equals(obj))
return false;
if(!(obj is MaterialRangedParam<Value>))
return false;
MaterialRangedParam<Value> other = (MaterialRangedParam<Value>)obj;
if((System.Object)other == null){
return false;
}
return (minValue.Equals(other.minValue)) && (maxValue.Equals(other.maxValue));
}
public override int GetHashCode(){
return base.GetHashCode() ^ minValue.GetHashCode() ^ maxValue.GetHashCode();
}
public static bool operator !=(MaterialRangedParam<Value> a, MaterialRangedParam<Value> b){
return !(a == b);
}
public static bool operator ==(MaterialRangedParam<Value> a, MaterialRangedParam<Value> b){
return a.Equals(b);
}
}