Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何转换动态列表<;对象>;到对象列表<;客户>;_C#_Asp.net Mvc_Entity Framework_Linq - Fatal编程技术网

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