GetProperty并尝试相互映射两个对象时出现C#AmbiguousMatchException

时间:2017-04-13 12:49:29

标签: c# propertyinfo

我正在尝试创建一个将eUsers列表对象映射到用户列表对象的函数。它实际上会映射一些属性,但是当propertyInfo.Name == "UserName"时,它会在下一行中给我AmbiguousMatchException

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

我测试了它似乎是由GetProperty方法触发的。我不确定是什么原因引起的。这是完整的功能:

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

编辑:

以下是User和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 个答案:

答案 0 :(得分:5)

UserName课程上声明new时,您使用UserName关键字在其中一个基类中隐藏了一个名为User的属性。这意味着实际上存在多个名为UserName的属性:来自其中一个基类的原始属性和User中的新属性。这就是导致AmbiguousMatchException的原因。

尝试使用BindingFlags.DeclaredOnly标志仅获取在相关类型上声明的属性:User