GetProperty 时出现 C# AmbiguousMatchException 并尝试将两个对象相互映射
C# AmbiguousMatchException when GetProperty and trying to map two objects with eachother
我正在尝试创建一个将 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的一部分class:
[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;
}
}
您在 class 中使用 new
关键字在您的 UserName
中隐藏一个名为 UserName
的 属性 =13=] class。这意味着实际上有不止一个 属性 叫做 UserName
:原始的来自 classes 之一,新的在 User
中。这就是导致 AmbiguousMatchException
的原因。
尝试使用 BindingFlags.DeclaredOnly
标志仅获取在相关类型上声明的属性:User
。
我正在尝试创建一个将 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的一部分class:
[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;
}
}
您在 class 中使用 new
关键字在您的 UserName
中隐藏一个名为 UserName
的 属性 =13=] class。这意味着实际上有不止一个 属性 叫做 UserName
:原始的来自 classes 之一,新的在 User
中。这就是导致 AmbiguousMatchException
的原因。
尝试使用 BindingFlags.DeclaredOnly
标志仅获取在相关类型上声明的属性:User
。