18

エンティティに 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 を使用しています。

4

3 に答える 3

28

以下の方法を使用できます。プロパティが存在する場合は、それを設定します。各呼び出しで使用GetTypeするとオーバーヘッドが発生する可能性があるため、最適化が必要です。

private bool TrySetProperty(object obj, string property, object value) {
  var prop = obj.GetType().GetProperty(property, BindingFlags.Public | BindingFlags.Instance);
  if(prop != null && prop.CanWrite) {
    prop.SetValue(obj, value, null);
    return true;
  }
  return false;
}

使用法

TrySetProperty(entry.Entity, "ModifiedDate", DateTime.Now);
于 2013-06-06T13:01:06.530 に答える