Mar*_*ark 10 c# generics equality
我想要一个可以接受引用或值类型的通用类,并且只执行基于相等性测试的操作.考虑以下:
public class Property<TProp>
where TProp : struct, IEquatable<TProp>
{
public TProp Value;
public void SetValue(ObservableObject owner, TProp value)
{
if (!Value.Equals(value)) // cannot use != on struct constrained TProp
{
// ... set the property
}
}
}
public class ByRefProperty<TProp>
where TProp : class // Dont want to require IEquatable<> on reference type TProp
{
public TProp Value;
public void SetValue(ObservableObject owner, TProp value)
{
if (Value != value)
{
// ... set the property
}
}
}
Run Code Online (Sandbox Code Playgroud)
我必须使用泛型约束和两个类才能测试值类型相等与引用类型相等.有什么方法可以解决这个问题吗?
我并不特别想要一个涉及装箱值类型,使用反射或运行时IL生成的解决方案.我错过了一个简单的解决方案吗?
Jon*_*eet 15
最好的方法是EqualityComparer<T>.Default:
public void SetValue(ObservableObject owner, TProp value)
{
if (!EqualityComparer<TProp>.Default.Equals(Value, value))
{
// ... set the property
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这甚至以逻辑方式为您处理空值(null等于null但没有别的).