2017-04-13 1 views
0

Ich versuche, eine Funktion, die ein eUsers-Liste-Objekt zu einem Benutzerlistenobjekt zuzuordnen. Es wird tatsächlich ein paar Eigenschaften zuordnen, aber wenn propertyInfo.Name == "UserName", wird es mir ein AmbiguousMatchException auf der folgenden Zeile werfen:C# AmbiguousMatchException, wenn GetProperty und versuchen, zwei Objekte miteinander zu verknüpfen

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

I getestet und es scheint es durch die GetProperty Methode ausgelöst wird. Ich bin mir nicht sicher, was das verursachen könnte. Hier ist die vollständige Funktion:

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:

Hier ist ein Teil der User und eUser Klasse:

[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

Können Sie die Klasse 'Benutzer' anzeigen? – stuartd

+0

Haben Sie versucht, dieses BindingFlags.IgnoreCase zu entfernen? –

+0

@stuartd hinzugefügt die Klassen –

Antwort

4

Sie sind Shadowing eine Eigenschaft UserName in einem Ihrer Basisklassen aufgerufen Verwenden Sie das Schlüsselwort new bei der Deklaration UserName auf Ihrer User Klasse. Dies bedeutet, dass tatsächlich mehrere Eigenschaften mit der Bezeichnung vorhanden sind: die ursprüngliche aus einer der Basisklassen und die neue aus User. Dies verursacht die AmbiguousMatchException.

Verwenden Sie das Flag BindingFlags.DeclaredOnly, um nur die Eigenschaften abzurufen, die für den betreffenden Typ deklariert wurden: User.

+0

Das hat den Trick, danke! –

Verwandte Themen