我在 C# 中有这段代码
foreach (var entry in auditableTableEntries)
{
IAuditableTable table = (IAuditableTable)entry.Entity;
table.ModifiedBy = userId;
table.ModifiedDate = dateTime;
if (entry.State == EntityState.Added || entry.State == EntityState.Modified)
{
if (table.CreatedBy == null || table.CreatedBy == null)
{
table.CreatedBy = userId;
table.CreatedDate = dateTime;
}
}
}
一些表对象有一个属性 modified
并且对于这些我想将属性设置为秒数的值。自 1970 年以来。类似于:
table.modified = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds
但是我如何判断该表是否具有该属性?如果该属性不存在,我不想设置该属性,因为我认为这会导致异常。
到目前为止,这是我尝试过的:
if (table.GetType().GetProperty("modified") != null)
{
// The following line will not work as it will report that
// an IAuditableTable does not have the .modified property
table.modified = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds
}
但问题是 table.modified 不是有效语法,因为 IAuditableTable 不包含修改后的属性。
最佳答案
使用反射:
PropertyInfo propInfo
= table.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
.FirstOrDefault(x => x.Name.Equals("modified ", StringComparison.OrdinalIgnoreCase));
// get value
if(propInfo != null)
{
propInfo.SetValue(table, DateTime.Now);
}
或者正如其他人指出的那样,您最好让您的类实现另一个接口(interface),例如 IHasModified
和:
if(table is IHasModified)
{
(table as IHasModified).modified = //whatever makes you happy. ;
}
关于c# - 如何测试对象是否具有属性并设置它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38238574/