Как я могу выбрать значение и тип списка Dynami c? - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть динамический c запрос, который возвращает мне динамические c столбцы (System.Linq.Dynamic.Core):

var data = data.Select("new (col1, col2, col3)", "T", StringComparison.OrdinalIgnoreCase);
[
   { col1: "This", col2: 1.56, col3: "Something else" }
]

Теперь мне нужно указать тип каждого столбца. Пример:

[
   {
      col1: { value: "This", type: "string" },
      col2: { value: 1.56, type: "decimal" }
   }
]

Чтобы получить это, я думал о чем-то вроде:

var rows = data.Select(x => new {
    Type = MyHelper.GetType(x),
    Value = x
});

Но это не работает.

Произошла необработанная ошибка Наилучшее перегруженное совпадение методов для 'MyHelper.GetType (System.Reflection.PropertyInfo)' имеет несколько недопустимых аргументов

Я знаю, как получить тип

public static string GetType(PropertyInfo type)
{
    return type.PropertyType.IsGenericType && type.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) ? type.PropertyType.GetGenericArguments()[0].ToString().Replace("System.", "") : type.PropertyType.Name;
}

Но я не знаю, как построить запрос.

[ОБНОВЛЕНИЕ]

Это попытка, но не то, что мне нужно

var rows = data.Select(x => new {
    Type = MyHelper.GetType(x.GetType()),
    Value = x
});
[
    {
        "type": "<>f__AnonymousType0`3",
        "value": {
            "col1": "2019-10-15T00:00:00",
            "col2": 0.00,
            "col3": "abc"
        }
    },
]

1 Ответ

0 голосов
/ 30 апреля 2020

Вот рабочая демонстрация, на которую вы можете сослаться:

public List<object> Get(int id)
{
    var data = new List<Object>
    {
        new{
            col1="aaa",
            col2= 1.25,
            col3 = 1
        },
        new{
            col2="asd",
            col3= 1.2,
            col4 =2
        }

    };
    var aaa = new List<object>() { };
    foreach (var item in data)
    {
        var ds = item.GetType().GetProperties();
        foreach(var i in ds)
        {
            var name = i.Name;
            var type = i.PropertyType.Name;
            var value = item.GetType().GetProperty(name).GetValue(item);
            aaa.Add(new  { name=name, type = type, value = value });

        }                
    }
    return aaa;
}
...