2012-03-01 91 views
1

我創建一個通用的方法:如何在使用泛型方法時設置泛型屬性?

private void UpdateAllProperties<idType, entityType>(entityType currentEntity, entityType newEntity) 
    where idType : IEquatable<idType> 
    where entityType : AbstractEntity<idType> 
{ 
    var currentEntityProperties = currentEntity.GetType().GetProperties(); 
    var newEntityProperties = newEntity.GetType().GetProperties(); 

    foreach (var currentEntityProperty in currentEntityProperties) 
    { 
     foreach (var newEntityProperty in newEntityProperties) 
     { 
      if (newEntityProperty.Name == currentEntityProperty.Name) 
      { 
       if (currentEntityProperty.PropertyType == typeof(AbstractEntity<>)) 
       { 
        // Here i want to use this method again, but i need to inform the types.. how can i do anything like that: 
        var idPropertyType = currentEntityProperty.PropertyType.GetProperty("Id").GetType(); 
        var entityPropertyType = currentEntityProperty.PropertyType; 

        // Here i got the error because i cannot set through this way 
        this.UpdateAllProperties<idPropertyType, entityPropertyType>(currentEntityProperty.GetValue(currentEntity, null), newEntityProperty.GetValue(newEntity, null)); 

        break; 
       } 
       else if (currentEntityProperty.PropertyType == typeof(ICollection<>)) 
       { 
        // TODO 

        break; 
       } 
       else 
       { 
        currentEntityProperty.SetValue(currentEntity, newEntityProperty.GetValue(newEntity, null), null); 

        break; 
       } 
      } 
     } 
    } 
} 

我怎樣才能做到這一點?

回答

2

你將不得不作出使用Type.GetMethod()獲取的方法和MethodInfo.MakeGenericMethod()與正確的類型對其進行設置,使用MethodInfo.Invoke()調用方法之前調用。

喜歡的東西:

var idPropertyType = currentEntityProperty.PropertyType.GetProperty("Id").PropertyType; 
var entityPropertyType = currentEntityProperty.PropertyType; 

var method = this.GetType().GetMethod("UpdateAllProperties", 
           BindingFlags.Instance | BindingFlags.NonPublic); 
var genericMethod = method.MakeGenericMethod(idPropertyType, entityPropertyType); 
genericMethod.Invoke(this, new[] { 
    currentEntityProperty.GetValue(currentEntity, null), 
    newEntityProperty.GetValue(newEntity, null) 
}); 
+0

我在這一行的一個問題:'VAR idPropertyType = currentEntityProperty.PropertyType.GetProperty( 「ID」)的GetType();'因爲返回類型爲'RuntimePropertyInfo' ,而不是'int'或者'decimal'(如果我已經將AbstractEntity Id的類型聲明爲int或decimal),那麼我怎樣才能得到'int'或'decimal'類型而不是'RuntimePropertyInfo' ? – 2012-03-01 14:45:09

+1

我想你想要:'var idPropertyType = currentEntityProperty.PropertyType.GetProperty(「Id」)。PropertyType' – Jamiec 2012-03-01 14:49:41

+0

是的,就是這樣!讓我測試一下現在是否可以完成。 – 2012-03-01 14:53:16