Как преобразовать список объектов со свойствами int, string в список объектов со всеми свойствами строк - PullRequest
0 голосов
/ 27 апреля 2018

Как преобразовать список объектов со свойствами типа int, string в список объектов со всеми свойствами строки?

Например: у меня есть список объектов с несколькими типами лайков { int Cd, string Name}

Я хочу преобразовать в список объектов, которым нравятся все строковые свойства {string Cd, string Cd}

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Может быть, вы могли бы использовать следующий подход отражения.

Это класс, который содержит все соответствующие свойства и поля и их значения:

public class StringType
{
    public StringType(IDictionary<MemberInfo, string> allPropertiesAndFields)
    {
        this.PropertiesAndFields = allPropertiesAndFields;
        this.PropertyFieldNamesAndValues = allPropertiesAndFields.ToDictionary(m => m.Key.Name, m => m.Value);
    }

    private IDictionary<MemberInfo, string> PropertiesAndFields { get; set; }
    private IDictionary<string, string> PropertyFieldNamesAndValues { get; set; }


    public string GetValue(string propertyOrFieldName)
    {
        bool isKnown = PropertyFieldNamesAndValues.TryGetValue(propertyOrFieldName, out string value);
        if (isKnown)
            return value;
        return null;
    }

    // if you want to know all informations about the property or field like type
    public MemberInfo GetMemberInfo(string propertyOrFieldName)
    {
        MemberInfo memberInfo = PropertiesAndFields.Keys.FirstOrDefault(mi => mi.Name == propertyOrFieldName);
        return memberInfo;
    }
}

Теперь вам нужен метод преобразования:

public static StringType ConvertSomeClassToString(Object instance)
{
    BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public; // maybe as parameter, cgange accordingly
    Type t = instance.GetType();
    PropertyInfo[] properties = t.GetProperties(bindingFlags);
    FieldInfo[] fields = t.GetFields(bindingFlags);
    var propertyMemberValues = properties.Select(p => new { Member = (MemberInfo) p, Value = p.GetValue(instance) });
    var fieldMemberValues = fields.Select(f => new { Member = (MemberInfo) f, Value = f.GetValue(instance) });

    Dictionary<MemberInfo, string> dict = propertyMemberValues
        .Concat(fieldMemberValues)
        .ToDictionary(m => m.Member, m => m.Value?.ToString());
    return new StringType(dict);
} 

Преобразует экземпляр любого типа в StringType. Вот пример:

var list = new List<SomeClass>() { new SomeClass { Name = "foo", Cd = 4711 } };
Converter<Object, StringType> converter = ConvertSomeClassToString;
List<StringType> stringItemList = list.ConvertAll(converter);
StringType st = stringItemList.First();
string valueOfCD = st.GetValue("Cd"); // "4711"
0 голосов
/ 27 апреля 2018

Вы можете использовать LINQ Select, как предложил @MichaWiedenmann, и создать новый анонимный класс со свойствами Cd и Name. Часть x.Cd.ToString() преобразует целочисленное свойство Cd каждого объекта внутри list в строку:

List<myObject> list = new List<myObject>()
{
     new myObject() {Cd=1,Name="John" },
     new myObject() {Cd=2,Name="Peter" },
     new myObject() {Cd=3,Name="David" }
};

var newList = list.Select(x => new { Cd = x.Cd.ToString(), Name = x.Name }).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...