Получить имя свойства и ввести его напрямую
Я задавал подобные вопросы здесь и здесь
Это образец типа:
public class Product {
public string Name { get; set; }
public string Title { get; set; }
public string Category { get; set; }
public bool IsAllowed { get; set; }
}
И у меня есть класс Generic, которому нужны свойства для генерации некоторых HTML-кодов:
public class Generator<T> {
public T MainType { get; set; }
public List<string> SelectedProperties { get; set; }
public string Generate() {
Dictionary<string, PropertyInfo> props;
props = typeof(T)
.GetProperties()
.ToDictionary<PropertyInfo, string>(prop => prop.Name);
Type propType = null;
string propName = "";
foreach(string item in SelectedProperties) {
if(props.Keys.Contains(item)) {
propType = props[item].PropertyType;
propName = item;
// Generate Html by propName & propType
}
}
И я использую эти типы следующим образом:
Product pr = new Product();
Generator<Product> GT = new Generator<Product>();
GT.MainType = pr;
GT.SelectedProperties = new List<string> { "Title", "IsAllowed" };
GT.Generate();
Поэтому я думаю, что этот процесс должен быть более простым, как есть, но я не знаю, как его реализовать, я думаю передать свойства генератору более просто, что-то вроде следующего псевдокода:
GT.SelectedProperties.Add(pr.Title);
GT.SelectedProperties.Add(pr.IsAllowed);
Я не знаю, возможно это или нет, мне нужны только две вещи, например 1-PropertyName: IsAllowed
2- тип свойства, как: bool
, Может быть, не нужно проходить MainType
Я использую его для получения типов свойств, поэтому, если я могу справиться, как указано выше, он мне больше не нужен.
Каково ваше предложение реализовать нечто подобное?
Есть ли лучший способ сделать это?
Обновить
Как ArsenMkrt
сказал, что нашел можно использовать MemberExpression
но я не могу получить тип свойства, я вижу тип свойства в отладке см. рисунок:
Итак, как я могу получить тип недвижимости?
Я нашел это здесь.
1 ответ
Вы можете использовать дерево выражений, чем ваш код будет выглядеть следующим образом
GT.SelectedProperties.Add(p=>p.Title);
GT.SelectedProperties.Add(p=>p.IsAllowed);
Вам нужно будет создать собственный класс коллекции, производный от List для SelectedProperties, и создать метод add, подобный этому
//where T is the type of your class
public string Add<TProp>(Expression<Func<T, TProp>> expression)
{
var body = expression.Body as MemberExpression;
if (body == null)
throw new ArgumentException("'expression' should be a member expression");
//Call List Add method with property name
Add(body.Member.Name);
}
Надеюсь это поможет