nad*_*adz 0 .net c# variance system.reflection
我正在寻找一种方法来获得对象的两个实例之间的差异.我编写的以下函数使用反射来实现手头的目的,但我想更多地增强它,以便它可以跳过具有特定数据注释的某些字段.例如,在实体框架模型中使用的'[NotMapped]和[JsonIgnore]'注释
public static List<ChangeSet> GetVariances<T>(this T previous, T updated)
{
List<ChangeSet> changeSet = new List<ChangeSet>();
try
{
string[] excludedFields = { "Id", "DateCreated", "DateModified" };
Type entityType = previous.GetType();
FieldInfo[] fieldInfo = entityType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
foreach (FieldInfo x in fieldInfo)
{
if (!excludedFields.Any(z => x.Name.Contains(z))){
ChangeSet change = new ChangeSet
{
Field = x.Name,
PreviousValue = x.GetValue(previous),
UpdatedValue = x.GetValue(updated)
};
if (!Equals(change.PreviousValue, change.UpdatedValue))
changeSet.Add(change);
}
}
}
catch (Exception ex)
{
var exception = ex.Message;
}
return changeSet;
}
Run Code Online (Sandbox Code Playgroud)
正在使用的模型示例:
[Table("ClientMaster")]
public partial class ClientMaster
{
[Key]
[JsonProperty(PropertyName = "id")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[JsonProperty(PropertyName = "clientId")]
[Required, StringLength(250)]
public string ClientId { get; set; }
[JsonProperty(PropertyName = "approvalLevel")]
[Required, StringLength(200)]
public string ApprovalLevel { get; set; }
[NotMapped]
[JsonProperty(PropertyName = "attachments")]
public List<ClientAttachmentModel> Attachments { get; set; }
[JsonIgnore]
public virtual UserInformation CreatedByUser { get; set; }
[JsonIgnore]
public virtual UserInformation ModifiedByUser { get; set; }
[JsonIgnore]
public virtual ICollection<TaskMaster> TaskMaster { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以指导我使功能跳过某些数据注释.任何帮助赞赏.
您可以检查字段或属性是否具有使用的属性 Attribute.IsDefined
var hasAttribute = Attribute.IsDefined(x, typeof(NotMappedAttribute));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |