【问题标题】:Copy data from a List of object to a different Object in C#将数据从对象列表复制到 C# 中的不同对象
【发布时间】:2016-08-13 20:33:11
【问题描述】:

我的目标是减少代码并避免在我传递的对象列表变长时添加条件,随着项目的进展,它可以达到 100 多个字段。我有一个 MyObject 类型的对象

public class MyObject
{
    public string fininstId { get; set; }
    public string paymentMethod { get; set; }
    public string cardNumber { get; set; }
    public string cardExpiry { get; set; }
    public string cardCVC { get; set; }
    public string AcctName { get; set; }
    public string Password { get; set; }
    public string mode { get; set; }
}

另一种响应类型

public class Response
{
    public Response();

    public string Title { get; set; }
    public string Value { get; set; }
}

并且我需要将下面 dataList 中包含的所有数据复制到 MyObject,因为我知道两个字段的名称将是相同的 MyObject 和 dataList

List<Response> dataList = new List<Response>();

/*...populating dataList here ...*/

MyObject request = new MyObject();

foreach (var item in dataList)
{
    switch (item.Title)
    {
        case "cardNumber":
            request.cardNumber = item.Value;
            break;
        case "cardExpiry":
            request.cardExpiry = item.Value;
            break;
        case "cardCVC":
            request.cardCVC = item.Value;
            break;
        case "fininstId":
            request.fininstId = item.Value;
            break;
        case "paymentMethod":
            request.paymentMethod = item.Value;
            break;
        case "AcctName":
            request.AcctName = item.Value;
            break;
        case "Password":
            request.Password = item.Value;
            break;
    }
}

无论如何它可以动态完成吗?

【问题讨论】:

  • 您可以使用反射将代码量减少到仅将标题字符串与属性名称匹配的代码量,但它的性能不会很接近。
  • 你可以use reflection to find a property that matches the string in Title。您需要考虑的条件是:“如果财产不存在怎么办?”和“如何处理类型转换?”。这些都没有一个微不足道的答案。

标签: c# .net


【解决方案1】:

你可以使用reflectionInvokeMember方法

例如:

Response item = new Response();
item.Title = "Password";
item.Value = "value";

MyObject request = new MyObject();
request.GetType().InvokeMember(item.Title,
BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty,
Type.DefaultBinder, request, new[] {item.Value} );

或者使用GetProperty & SetValue

var property = typeof(MyObject).GetProperty(item.Title);
property.SetValue(request, item.Value, null);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多