Привести значение типа объекта в тип и получить значения из него с помощью отражения - PullRequest
0 голосов
/ 03 марта 2012

Название может не совсем объяснить, что мне нужно, но вот пример:

Это моя модель:

public class Car {

    public int CarId { get; set; }
    public string Name { get; set; }
    public string Model { get; set; }
    public string Make { get; set; }
}

Вот логика:

class Program {

    static void Main(string[] args) {

        var cars = new List<Car> { 
            new Car { CarId = 1, Make = "Foo", Model = "FooM", Name = "FooN" },
            new Car { CarId = 2, Make = "Foo2", Model = "FooM2", Name = "FooN2" }
        }.AsQueryable();

        doWork(cars.GetType(), cars);

    }

    static void doWork(Type type, object value) {

        if (isTypeOfIEnumerable(type)) {
            Type itemType = type.GetGenericArguments()[0];

            Console.WriteLine(
                string.Join<string>(
                    " -- ", itemType.GetProperties().Select(x => x.Name)
                )
            );

            //How to grab values at the same order as properties? 
            //E.g. If Car.Name was pulled first, 
            //then the value of that property should be pulled here first as well
        }
    }

    static bool isTypeOfIEnumerable(Type type) {

        foreach (Type interfaceType in type.GetInterfaces()) {

            if (interfaceType.IsGenericType &&
                    interfaceType.GetGenericTypeDefinition() == typeof(IEnumerable<>))
                return true;
        }

        return false;
    }
}

То, что я здесь делаю, может не иметь смысла, но мне нужна такая операция где-то еще. У меня есть Type и Object, и мне нужно построить из него таблицу. В этом примере метод doWork очень похож на тот, с которым я имею дело в моем реальном примере.

Мне удалось получить имена свойств, но я не смог найти способ извлечь значения из параметра value.

Любой

1 Ответ

1 голос
/ 03 марта 2012

Вы пробовали что-то подобное?

obj.GetType().GetProperties()
   .Select(pi => new { Name = pi.Name, Value = pi.GetValue(obj, null) })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...