Как установить универсальный атрибут свойства в универсальном методе при его использовании? - PullRequest
1 голос
/ 01 марта 2012

Я создаю общий метод:

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;
                }
            }
        }
    }
}

Как я могу это сделать?

1 Ответ

2 голосов
/ 01 марта 2012

Вы должны будете сделать вызов, используя 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)
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...