我寫了一個驗證屬性來使條件Required是可能的。爲什麼兩個相等比較的結果不同,取決於操作員?
public class RequiredIfEqualsAttribute : RequiredAttribute
{
private readonly string _otherProperty;
private readonly object _value;
public RequiredIfEqualsAttribute(string otherProperty, object value)
: base()
{
this._otherProperty = otherProperty;
this._value = value;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var valToCompare = validationContext.ObjectInstance.GetType().GetProperty(_otherProperty).GetValue(validationContext.ObjectInstance, null);
if (valToCompare == _value)
{
return base.IsValid(value, validationContext);
}
return null;
}
}
這是很容易使用:
[EnumDataType(typeof(SomeEnum))]
[Required]
public SomeEnum SomeType { get; set; }
[RequiredIfEquals("SomeType", SomeEnum.A)]
public string A { get; set; }
[RequiredIfEquals("SomeType", SomeEnum.B)]
public string B { get; set; }
我注意到一個奇怪的現象,雖然。該行:
if (valToCompare == _value)
實際上將評估爲false
,即使valToCompare
和_value
都代表SomeEnum.A
。
是否因爲_value
是隻讀的?當我用下面一切正常:
if (valToCompare.Equals(_value))
在這種情況下,如果valToCompare
和_value
都表示SomeEnum.A
,該聲明將評估爲true
,因爲它應該。
誰能賜教我?
在C#中,'=='和'Equals()'是不一樣的,每個運算符都可以被重寫爲具有不同的邏輯。然而,通常'=='表示引用相等,而Equals()表示值相等。 – 2014-09-22 09:38:04