Это мой самый первый пост, и хотя я в определенной степени искал темы, связанные с моей проблемой, у меня возникли проблемы с поиском правильного ответа.Создайте новый объект PropertyInfo на лету
Мой вопрос может быть очень простым, но я знаю, что ответ не так-то просто дать. Если какой-либо существует вообще.
С этим, как говорится, это мой случай: в качестве примера, у меня есть массив объектов PropertyInfo, которые я использую, чтобы получить свойства из класса, как это:
public PropertyInfo[] GetProperties (object o)
{
PropertyInfo[] properties = o.GetType().GetProperties();
return properties;
}
Выглядит легко , правильно? Теперь моя проблема заключается в следующем: как создать новый объект PropertyInfo и добавить его в массив?
Я видел другие сообщения, где пользователи хотят установить VALUE в PropertyInfo, но это не то, что мне нужно. Мне нужно создать на лету новый объект PropertyInfo, где есть только доступные данные: Название и Тип.
Испытуемый случай, который я опубликовал ранее, является лишь небольшим примером того, чего я пытаюсь достичь. Моя истинная и конечная цель, на самом деле, чтобы быть в состоянии создать новый PropertyInfo на основе этого класса:
public class DynamicClass
{
public Type ObjectType { get; set; }
public List<string> PropertyNameList { get; set; }
public List<Type> PropertyTypeList { get; set; }
}
Я надеюсь, что кто-то может помочь мне достичь этого. Спасибо заранее!
EDITED: Я забыл добавить o.GetType() перед методом GetProperties(). Спасибо Илье Иванов!
Я вызова метода SelectProperties так:
list = _queriable.Select(SelectProperties).ToList();
метод выглядит следующим образом:
private Expression<Func<T, List<string>>> SelectProperties
{
get
{
return value => _properties.Select
(
prop => (prop.GetValue(value, new object[0]) ?? string.Empty).ToString()
).ToList();
}
}
С наилучшими пожеланиями,
Луис
ОБНОВЛЕНИЕ:
Хорошо, поэтому я следую советам 280Z28 и наследую PropertyInfo в новом классе. Я провел больше исследований, и я нашел в MSDN, что мне нужно переопределить следующие методы: GetValue, SetValue, GetAccessors, GetGetMethod, GetSetMethod и GetIndexParameters.
Однако, когда я пытаюсь вызвать базу с параметрами, она дает мне сообщение об ошибке, и я цитирую «Не могу назвать абстрактный элемент:« System.Reflection.PropertyInfo.GetAccessesors (bool) ». Если я попытаюсь вызвать метод без каких-либо параметров, он не обнаруживает никаких ошибок, но я чувствую, что это неправильный подход.
Это то, что я получил до сих пор:
public override MethodInfo[] GetAccessors(bool nonPublic)
{
MethodInfo[] temp = base.GetAccessors(nonPublic);
return temp;
}
UPDATE 2:
Хорошо, что не работает хорошо. После нескольких часов попыток сделать производный класс либо PropertyInfo, либо PropertyDescriptor, я решил не заниматься этим подходом.
Вместо этого у меня была другая идея - читать другие сообщения. Моя истинная проблема заключается в том, что класс, который я обычно читаю и использую для получения свойств, не всегда одинаковый. Поэтому я понял, что мне, вероятно, действительно нужно, это просто способ создать динамический класс на лету, и только , затем.
Я читал, что существует такая вещь, как ExpandoObject и ElasticObject, хотя я еще не знаю, как применить их к моей проблеме, чтобы получить окончательное решение.
Хорошо, теперь, что я действительно делаю это -> Я использовал решение, указанное в следующей ссылке: jQuery DataTables Plugin Meets C#.
Дело в том, Это предполагает, я буду иметь различные статические модели/классы для каждой БД Таблица. Однако в моем случае у меня будет два типа столбцов: те, которые предоставляются каждым классом таблицы DB (также называются базовыми столбцами), а затем дополнительные столбцы, которые я динамически поставляю уже в моей адаптации.
Например: если класс DB таблица:
public class Table1
{
public int Field1;
public string Field2;
public string Field3;
}
А потом поставить дополнительный столбец под названием «Действие» строкового типа, то в классе DataTableParser, в то _Недвижимости attribure там должен быть следующая информация:
_properties[0] should be int32 Field1
_properties[1] should be String Field2
_properties[2] should be String Field3
_properties[3] should be String Action
И честно говоря, что это ВСЕ мне нужно! Ни больше ни меньше! В остальном я уже разбираюсь!
В конце концов, поскольку у меня есть другое количество столбцов (поставлено), чем объект, переданный классу DataTableParser, он всегда дает ошибку во время сортировки и фильтрации DataTable.
Любая помощь пожалуйста? Мне это действительно нужно! Еще раз спасибо.
С наилучшими пожеланиями,
Луис
Обычно вы проходите через 'aType.GetProperties'. –
'typeof (o)' это не будет компилироваться. Вероятно, вы имеете в виду 'o.GetType(). GetProperties()' –
Как вы собираетесь использовать этот объект (ы), который вы пытаетесь создать? – Andrei