【发布时间】:2021-01-14 10:32:16
【问题描述】:
我想检查一个实体是否有 3 个属性。 CreatedDate、ModifiedDate 和 ModifiedBy。
现在我只是在我的对象上下文的 SaveChanges() 方法中硬编码我知道的那些。
例如:
bool newEntity = (entry.State == EntityState.Added);
if (type == typeof(Foo))
{
var r = entry.Entity as Foo;
if (r != null)
{
if (newEntity)
r.CreatedDate = DateTime.Now;
r.ModifiedDate = DateTime.Now;
r.ModifiedBy = HttpContext.Current.User.Identity.Name;
}
}
我知道可以使用类似下面的代码来检查一个对象是否有某种方法:
public static bool HasMethod(this object objectToCheck, string methodName)
{
var type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
但是我如何在不直接转换实体的情况下获得这些属性?
我该怎么做:
if (HasMethod(entry.Entity))
entry.Entity.ModifiedDate = DateTime.Now;
我正在使用 ASP.Net MVC 4。
【问题讨论】:
-
使用反射。
PropertyInfo. -
也许dynamic 可以用于此,但我必须说我不确定。
-
在标题中添加标签是没有意义的。请阅读meta.stackexchange.com/q/19190/147072了解更多信息。
-
如果您有权访问这些实体的声明,更好的是创建一个包含这些属性的接口,将该接口分配给所有也包含它们的实体,然后检查该对象是否实现那个界面。
-
对于这样的事情,我倾向于将这些属性放在我的所有数据库映射实体都继承自的基类上,这样我就知道它们会在那里。然后您可以添加
where T : EntityBase并直接从您的Add<T>()和Update<T>()方法访问属性。我知道在你的情况下这可能是不可能的,但值得一提。
标签: c# entity-framework