【发布时间】:2015-08-05 19:27:41
【问题描述】:
我有一个带有属性的 EntityFramework 模型,我用它来验证字段。
private person tipProvider;
[Required]
[ForeignKey("TipProviderId")]
public virtual person TipProvider
{
get { return tipProvider; }
set
{
tipProvider = value;
ValidateProperty(MethodBase.GetCurrentMethod().Name.Replace("set_", ""));
raisePropertyChanged(MethodBase.GetCurrentMethod().Name.Replace("set_", ""));
}
}
我得到PropertyInfo,然后是它的验证属性,我用它来验证属性:
public virtual void ValidateProperty(string property)
{
errors[property].Clear();
var propertyInfo = this.GetType().GetProperty(property);
var propertyValue = propertyInfo.GetValue(this);
var validationAttributes = propertyInfo.GetCustomAttributes(true).OfType<ValidationAttribute>();
foreach (var validationAttribute in validationAttributes)
{
if (!validationAttribute.IsValid(propertyValue))
{
errors[property].Add(validationAttribute.FormatErrorMessage(string.Empty));
}
}
raiseErrorsChanged(property);
}
当属性是虚拟的时,我无法通过反射找到属性。如果删除了 virtual 关键字,则会找到属性。
我真的对这种行为感到困惑。为什么不能在虚拟属性上应用属性?
【问题讨论】:
-
尝试设置合适的 BindingFlags。喜欢:
static void Main() { var method = typeof(A).GetMethod("Method", BindingFlags.Public | BindingFlags.Instance); Console.WriteLine(method.IsVirtual); var property = typeof(A).GetProperty("Property", BindingFlags.Public | BindingFlags.Instance); Console.WriteLine(property.GetGetMethod().IsVirtual); } public class A { public virtual void Method() { } public virtual string Property { get; set; } }} -
@Frederick 没有变化,GetGetMethod().IsVirtual 和 GetSetMethod().IsVirtual 都是 true
-
是的。但是设置了 BindingFlags 后,您就有了一个有效的 PropertyInfo 对象。这不是你要找的吗?
-
@Frederick 我之前有一个有效的 PropertyInfo 对象,只是我无法通过它找到属性
-
您是否覆盖了派生类中的属性?
标签: c# entity-framework reflection