2017-04-13 1 views
0

J'essaie de créer une fonction qui mappe un objet de liste eUsers à un objet de liste d'utilisateurs. Il tracera fait quelques propriétés, mais quand propertyInfo.Name == "UserName", ça va me jeter un AmbiguousMatchException sur la ligne suivante:C# AmbiguousMatchException lorsque GetProperty et essayant de mapper deux objets les uns avec les autres

typeof(User) 
    .GetProperty(ePropertyInfo.Name, BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetField) 
    .SetValue(user, ePropertyInfo.GetValue(currentEUser)); 

Je l'ai testé et il semble qu'il soit déclenché par la méthode GetProperty. Je ne suis pas vraiment sûr de ce qui pourrait causer ça. Voici la fonction complète:

private List<User> ConvertEUsersToUsers(List<eUser> eUsers) 
{ 
    List<User> users = new List<User>(); 
    User user = null; 

    IList<PropertyInfo> eUserProps = new List<PropertyInfo>(eUsers.FirstOrDefault().GetType().GetProperties()); 
    IList<PropertyInfo> userProps = typeof(User).GetProperties(); 
    foreach (eUser currentEUser in eUsers) 
    { 
     user = new User(); 
     foreach (PropertyInfo ePropertyInfo in eUserProps) 
     { 
      foreach (PropertyInfo propertyInfo in userProps) 
      { 
       if (propertyInfo.Name == ePropertyInfo.Name) 
       { 
        if (ePropertyInfo.CanWrite) 
        { 
         typeof(User) 
          .GetProperty(ePropertyInfo.Name, BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetField) 
          .SetValue(user, ePropertyInfo.GetValue(currentEUser)); 
        } 
        break; 
       } 
      } 
     } 
     users.Add(user); 
    } 
    return users; 
} 

EDIT:

Voici une partie de la classe utilisateur et Euser:

[Serializable] 
[Application(7)] 
[Table("Users")] 
public partial class User : MembershipUser, IPrincipal, IIdentity, IEntity, IIdNameClass { 

    [Column("Name")] 
    public new EntityField UserName { get; set; } 
} 

[Table("Users")] 
public class eUser : User 
{ 
    [NotMapped] 
    public Boolean selected { get; set; } 

    public new UserTypes UserType { get; set; } 

    public eUser() : base() 
    { 
     selected = false; 
    } 
} 
+1

Pouvez-vous montrer la classe 'User'? – stuartd

+0

Avez-vous essayé de supprimer ce BindingFlags.IgnoreCase? –

+0

@stuartd a ajouté les classes –

Répondre

4

Vous shadowing une propriété appelée UserName dans l'une de vos classes de base en utilisant le mot-clé new lors de la déclaration UserName sur votre classe User. Cela signifie qu'il existe en fait plus d'une propriété appelée UserName: l'origine de l'une des classes de base et la nouvelle User. C'est ce qui provoque le AmbiguousMatchException. Essayez d'utiliser l'indicateur BindingFlags.DeclaredOnly pour extraire uniquement les propriétés déclarées sur le type en question: User.

+0

Cela a fait l'affaire, merci! –