Использование отражения для приведения объекта в список пользовательских типов - PullRequest
0 голосов
/ 12 июня 2019

У меня есть следующий сценарий:

У меня есть составной объект, который включает в себя списки, я хочу передать путь к нему, как - Result.CustomerList.Name

Результат являетсяобъект, который содержит список клиентов, но также содержит много других списков различных типов.Я хочу получить Имена клиентов в этом конкретном случае.

Что у меня есть до сих пор

    private static object GetPropertyValue(this object obj, string propertyPath)
    {
        var fullPath = propertyPath.Split('.');
        for (int i = 0; i <= fullPath.Length - 1; i++)
        {
            if (obj == null) { return null; }
            var part = fullPath[i];

            Type type = obj.GetType();
            PropertyInfo propInfo = type.GetProperty(part);

            if (propInfo == null)
            {
                //if its a list
                if (obj.GetType().GetInterfaces().Any(
                    k => k.IsGenericType
                    && k.GetGenericTypeDefinition() == typeof(IEnumerable<>)))
                {
                    //get list generic argument
                    var argumentType = obj.GetType().GetGenericArguments()[0];

                   //cast obj to List of argumentType


                }
                else return null;
            }

            obj = propInfo.GetValue(obj, null);
        }

        return obj;
    }

Я не могу получить синтаксис или как привести к списку или списку это не такработа или список

Я не понимаю, что мне не хватает или как это сделать.

EDIT :: Во время выполнения может быть CustomerList, AddressList или PaymentList или любой другой тип списка.Мне нужен метод, чтобы иметь возможность получить значение свойства в любом типе списка во время выполнения.

EDIT2 :: Пример объекта Result

public class SearchResults
{
    public List<Customer> Customers { get; set; }
    public List<Payment> Payments { get; set; }
    public List<Address> Addresses{ get; set; }
    public int totalCount { get; set; }
    public bool success { get; set; }


}

public class Customer
{
    public string Name { get; set; }
    public long Id { get; set; }
}

public class Payment
{
    public string BankName{ get; set; }
    public long Id { get; set; }
}

Так что путь, как Result.Payments.BankName должен вернуть мне что угодно.Проблема в том, что я не могу сделать метод универсальным для доступа к любому из списков.

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Мне удалось решить мою проблему с динамическим

private static object GetPropertyValue(this object obj, string propertyPath)
    {
        var fullPath = propertyPath.Split('.');
        for(int i = 0; i <= fullPath.Length - 1; i++)
        {
            if (obj == null) { return null; }
            var part = fullPath[i];

            Type type = obj.GetType();
            PropertyInfo propInfo = type.GetProperty(part);

            if (propInfo == null)
            {
                //if its a list
                if (obj.GetType().GetInterfaces().Any(
                    k => k.IsGenericType
                    && k.GetGenericTypeDefinition() == typeof(IEnumerable<>)))
                {
                    //convert to IList from object
                    var genericList = (IList)obj;

                    //returned the desired property
                    return genericList.Cast<dynamic>()
                        .First(p => p.PropertyName.ToLower().Equals(part.ToLower()))
                        .PropertyValue;
                }
                else return null;
            }

            obj = propInfo.GetValue(obj, null);
        }

        return obj;
    }

Этот метод теперь работает для каждого списка в моем объекте.

0 голосов
/ 12 июня 2019

Я думаю, что может быть проще просто перечислить объект, приведя его к IEnumerable:

var objCollection = obj as IEnumerable;
if (objCollection == null)
{
    // this is not a collection
}
else
{
    // just enumerate the objCollection.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...