【问题标题】:C# Convert List<T> to Object PropertiesC# 将 List<T> 转换为对象属性
【发布时间】:2017-08-20 05:56:41
【问题描述】:

我正在寻找一种将 List&lt;Tag&gt; 项目转换为 Object 属性的方法。
例如,我想转换每个标签,使标签name 的值是新的对象属性名称,标签value 的值是对象属性的值。

例如
转换List: [{"name":"KS_1","value":123},{"name":"KS_2","value":"ABC"}]
转入Object{KS_1: 123, KS_2: "ABC"}

对象名称和值未预定义。
我正在使用.Net 3.5,所以我不能使用ExpandoObject

【问题讨论】:

  • 你可以用反射来做到这一点,你有没有尝试过?
  • 在运行时之前知道名称吗?如果没有,您可以使用ExpandoObject
  • 您将如何访问这些属性?要么查看ExpandoObject,要么你必须使用TypeBuilder创建类型
  • 名称和值未预定义。
  • 为什么要投反对票?如果您有解决方案,请分享。

标签: c# list object converter


【解决方案1】:

问题可以通过使用Linq的匿名类型来解决,如下所示。

var Result = new Object()
{
    KS_1: List[0].value,
    KS_2: List[1].value
};

但是,如果需要列表成员的可变列表,则必须使用反射。

【讨论】:

  • 名称未预定义。
  • 如果在编译时名称未知,如何访问这些值;通过反射?
【解决方案2】:

一种选择是使用反射。这是一个完成这项工作的扩展方法:

public T FromTags<T>(this List<Tag> tags)
    where T : new()
{
    var t = new T();

    var properties = typeof(T).GetProperties();

    foreach (var tag in tags)
    {
        var property = properties.SingleOrDefault(p => p.Name == tag.name);

        if (property != null)
        {
            property.SetValue(t, tag.value);
        }
    }

    return t;
}

你会这样称呼它:

public class MyThing
{
    public string SomeProperty { get; set; }
    public string AnotherProperty { get; set; }
}

var myThing = tags.FromTags<MyThing>();

【讨论】:

    猜你喜欢
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多