Получить имя и тип свойства, используя выражение lambda

Я пытаюсь написать функцию, которая вытащит имя свойства и типа с помощью синтаксиса, как показано ниже:

private class SomeClass { Public string Col1; } PropertyMapper propertyMapper = new PropertyMapper(); propertyMapper.MapProperty(x => x.Col1) 

Есть ли способ передать свойство через функцию без каких-либо серьезных изменений в этом синтаксисе?

Я хотел бы получить имя свойства и тип свойства.

Поэтому в приведенном ниже примере я хотел бы получить

Name = "Col1" и Type = "System.String"

Может ли кто-нибудь помочь?

Здесь достаточно примера использования выражений, чтобы получить имя свойства или поля, чтобы начать работу:

 public static MemberInfo GetMemberInfo(Expression> expression) { var member = expression.Body as MemberExpression; if (member != null) return member.Member; throw new ArgumentException("Expression is not a member access", "expression"); } 

Код вызова будет выглядеть так:

 public class Program { public string Name { get { return "My Program"; } } static void Main() { MemberInfo member = ReflectionUtility.GetMemberInfo((Program p) => p.Name); Console.WriteLine(member.Name); } } 

Слово предостережения, однако: простая статистика (Program p) => p.Name фактически включает в себя довольно много работы (и может принимать измеримое количество времени). Рассмотрите кеширование результата, а не часто вызывайте метод.

Я нашел это очень полезным.

 public class PropertyMapper { public virtual PropertyInfo PropertyInfo(Expression> expression) { var member = expression.Body as MemberExpression; if (member != null && member.Member is PropertyInfo) return member.Member as PropertyInfo; throw new ArgumentException("Expression is not a Property", "expression"); } public virtual string PropertyName(Expression> expression) { return PropertyInfo(expression).Name; } public virtual Type PropertyType(Expression> expression) { return PropertyInfo(expression).PropertyType; } } 

Я сделал этот маленький class, чтобы выполнить первоначальный запрос. Если вам нужно имя свойства, вы можете использовать его следующим образом:

 PropertyMapper propertyMapper = new PropertyMapper(); string name = propertyMapper.PropertyName(x => x.Col1); 

Это можно легко сделать на C # 6. Чтобы получить имя свойства, используйте имя оператора.

 nameof(User.UserId) 

и получить тип свойства use typeof operator.

 typeof(User.UserId) 

Я просто подумал, что я бы поставил это здесь, чтобы опираться на предыдущий подход.

 public static class Helpers { public static string PropertyName(Expression> expression) { var member = expression.Body as MemberExpression; if (member != null && member.Member is PropertyInfo) return member.Member.Name; throw new ArgumentException("Expression is not a Property", "expression"); } } 

Затем вы можете вызвать его следующим образом:

 Helpers.PropertyName(() => TestModel.TestProperty); 

Следует также отметить, что с VS 2015 и C # 6.0 вы можете просто использовать nameof.

https://msdn.microsoft.com/en-us/library/dn986596.aspx

  • Как получить MethodInfo метода интерфейса, внедряя MethodInfo метода classа?
  • Почему рекомендуется использовать reflection в .NET?
  • Есть что-то вроде instanceOf (class C) в Java?
  • получение типа T из IEnumerable
  • Получить свойства и значения из неизвестного объекта
  • Более быстрые альтернативы отражению Java
  • Как получить значение свойства с помощью отражения
  • C # Получение значения парм с использованием отражения
  • Type.GetType ("namespace.abClassName") возвращает null
  • Быстрое создание объектов вместо Activator.CreateInstance (type)
  • Создание экземпляра конструктора с параметрами во внутреннем classе с reflectionм
  • Interesting Posts

    Передача данных из одной активности в другую с помощью пакета – не отображение во второй активности

    Использование «окончательного» модификатора, когда это применимо в Java

    Использование Excel VBA для запуска SQL-запроса

    Указатели на C: когда использовать амперсанд и звездочку?

    Как переустановить загрузчик grub-efi на Fedora Linux?

    Crysis на Windows 8.1 запускает предупреждение с низкой памятью

    Память присваивается

    Читайте url для строки в нескольких строках кода Java

    Слияние двух файлов excel с использованием общего столбца

    Вернуть карту, как «ok» в Голанге, при нормальных функциях

    Рассчитать расстояние, заданное двумя точками, широтой и долготой

    Коллекции. Синхронизированный список и синхронизация

    Как сделать символы Unicode типа Java.awt.Robot? (Является ли это возможным?)

    Сбросить или вернуть конкретный файл в конкретную версию с помощью Git?

    Control.AddRange (…) медленный

    Давайте будем гением компьютера.