C# 如何转换动态列表<;对象>;到对象列表<;客户>;
我正在尝试将动态列表C# 如何转换动态列表<;对象>;到对象列表<;客户>;,c#,asp.net-mvc,entity-framework,linq,C#,Asp.net Mvc,Entity Framework,Linq,我正在尝试将动态列表列表转换为列表。 动态列表共有10个属性(Id、名称、电话号码、地址、SecodaryPhone、电子邮件等),客户类只有Id、名称和电话号码。 我想转换列表,以便它可以复制具有映射属性的列表 我不能使用动态属性的名称,因为这可以存储其他类型的产品。安装AutoMapper NuGet软件包。然后,您可以按如下方式播放列表: class Program { static void Main(string[] args) { var config
列表
转换为列表
。
动态列表共有10个属性(Id、名称、电话号码、地址、SecodaryPhone、电子邮件等),客户类只有Id、名称和电话号码。
我想转换列表,以便它可以复制具有映射属性的列表
我不能使用动态属性的名称,因为这可以存储其他类型的产品。安装AutoMapper NuGet软件包。然后,您可以按如下方式播放列表:
class Program
{
static void Main(string[] args)
{
var config = new MapperConfiguration(cfg => { });
var mapper = config.CreateMapper();
dynamic person = new { Name = "John", Id = 10 };
var people = new List<dynamic>() { person };
var cusomters = people.Select(p => mapper.Map<Customer>(p)).ToList();
}
}
class Customer
{
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
dynamic people = new { Name = "John", Id = 10 };
var list = new List<dynamic>() { people };
var result = list.Select(p => new Customer(p)).ToList();
}
}
class Customer
{
public string Name { get; set; }
public Customer(dynamic arg)
{
Name = arg.Name;
}
}
类程序
{
静态void Main(字符串[]参数)
{
var config=new-MapperConfiguration(cfg=>{});
var mapper=config.CreateMapper();
动态人=new{Name=“John”,Id=10};
var people=新列表(){person};
var cusomters=people.Select(p=>mapper.Map(p)).ToList();
}
}
类客户
{
公共字符串名称{get;set;}
}
编辑
或者,如果您不想使用AutoMapper,可以尝试以下方法:
class Program
{
static void Main(string[] args)
{
var config = new MapperConfiguration(cfg => { });
var mapper = config.CreateMapper();
dynamic person = new { Name = "John", Id = 10 };
var people = new List<dynamic>() { person };
var cusomters = people.Select(p => mapper.Map<Customer>(p)).ToList();
}
}
class Customer
{
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
dynamic people = new { Name = "John", Id = 10 };
var list = new List<dynamic>() { people };
var result = list.Select(p => new Customer(p)).ToList();
}
}
class Customer
{
public string Name { get; set; }
public Customer(dynamic arg)
{
Name = arg.Name;
}
}
类程序
{
静态void Main(字符串[]参数)
{
动态人物=新{Name=“John”,Id=10};
var list=new list(){people};
var result=list.Select(p=>newcustomer(p)).ToList();
}
}
类客户
{
公共字符串名称{get;set;}
公共客户(动态参数)
{
Name=arg.Name;
}
}
使用一些扩展使使用MemberInfo
更容易:
// ***
// *** Type Extensions
// ***
public static List<MemberInfo> GetPropertiesOrFields(this Type t, BindingFlags bf = BindingFlags.Public | BindingFlags.Instance) =>
t.GetMembers(bf).Where(mi => mi.MemberType == MemberTypes.Field | mi.MemberType == MemberTypes.Property).ToList();
// ***
// *** MemberInfo Extensions
// ***
public static object GetValue(this MemberInfo member, object srcObject) {
switch (member) {
case FieldInfo mfi:
return mfi.GetValue(srcObject);
case PropertyInfo mpi:
return mpi.GetValue(srcObject);
default:
throw new ArgumentException("MemberInfo must be of type FieldInfo or PropertyInfo", nameof(member));
}
}
public static T GetValue<T>(this MemberInfo member, object srcObject) => (T)member.GetValue(srcObject);
public static void SetValue<T>(this MemberInfo member, object destObject, T value) {
switch (member) {
case FieldInfo mfi:
mfi.SetValue(destObject, value);
break;
case PropertyInfo mpi:
mpi.SetValue(destObject, value);
break;
default:
throw new ArgumentException("MemberInfo must be of type FieldInfo or PropertyInfo", nameof(member));
}
}
然后您只需转换到列表
:
var ans=sourceList.Cast()。选择(m=>newcustomer{
Id=m.Id,
Name=m.Name,
PhoneNo=m.PhoneNo
});
如果您可以使用动态
,则此功能应能正常工作
var list = new List<object>(new []
{
new DynamicObject {Id = $"{1}", Name = $"Name{1}", PhoneNo = $"555-000{1}-1234"},
new DynamicObject {Id = $"{2}", Name = $"Name{2}", PhoneNo = $"555-000{2}-1234"},
new DynamicObject {Id = $"{3}", Name = $"Name{3}", PhoneNo = $"555-000{3}-1234"},
});
var customers = ((IEnumerable<dynamic>)list).Select(x => new Customer{ Id = x.Id, Name = x.Name, PhoneNo = x.PhoneNo}).ToArray();
Customer customer = customers.First();
class DynamicObject
{
public string Id { get; set; }
public string Name { get; set; }
public string PhoneNo { get; set; }
public string Address { get; set; }
public string SecodaryPhone { get; set; }
public string Email { get; set; }
}
class Customer
{
public string Id { get; set; }
public string Name { get; set; }
public string PhoneNo { get; set; }
}
var list=新列表(新[]
{
新的动态对象{Id=$“{1}”,Name=$“Name{1}”,PhoneNo=$“555-000{1}-1234},
新的动态对象{Id=$“{2}”,Name=$“Name{2}”,PhoneNo=$“555-000{2}-1234},
新的动态对象{Id=$“{3}”,Name=$“Name{3}”,PhoneNo=$“555-000{3}-1234},
});
var customers=((IEnumerable)list).选择(x=>新客户{Id=x.Id,Name=x.Name,PhoneNo=x.PhoneNo}).ToArray();
Customer=customers.First();
类动态对象
{
公共字符串Id{get;set;}
公共字符串名称{get;set;}
公共字符串PhoneNo{get;set;}
公共字符串地址{get;set;}
公共字符串SecodaryPhone{get;set;}
公共字符串电子邮件{get;set;}
}
类客户
{
公共字符串Id{get;set;}
公共字符串名称{get;set;}
公共字符串PhoneNo{get;set;}
}
关于AutoMapper
?关于使用listofObject.Select(x=>newcustomer{Id=x.Id,Name=x.Name,PhoneNo=x.PhoneNo})怎么样代码>?但是,在尝试上面的建议代码之前,您需要展示您转换这两个列表的努力。您的:dynamic list“实际上是一个列表
,还是您的意思是成员的实际类型可能在不同的时间有所不同?或者该列表包含多个不同的类型?您的最后一句话是什么意思?
var ans = sourceList.Cast<IIDBase>().Select(m => new Customer {
Id = m.Id,
Name = m.Name,
PhoneNo = m.PhoneNo
});
var list = new List<object>(new []
{
new DynamicObject {Id = $"{1}", Name = $"Name{1}", PhoneNo = $"555-000{1}-1234"},
new DynamicObject {Id = $"{2}", Name = $"Name{2}", PhoneNo = $"555-000{2}-1234"},
new DynamicObject {Id = $"{3}", Name = $"Name{3}", PhoneNo = $"555-000{3}-1234"},
});
var customers = ((IEnumerable<dynamic>)list).Select(x => new Customer{ Id = x.Id, Name = x.Name, PhoneNo = x.PhoneNo}).ToArray();
Customer customer = customers.First();
class DynamicObject
{
public string Id { get; set; }
public string Name { get; set; }
public string PhoneNo { get; set; }
public string Address { get; set; }
public string SecodaryPhone { get; set; }
public string Email { get; set; }
}
class Customer
{
public string Id { get; set; }
public string Name { get; set; }
public string PhoneNo { get; set; }
}