Я пытаюсь реализовать преобразование данных, используя пример отражения 1 в моем коде.
GetSourceValue
Функция имеет переключатель сравнения различных типов, но я хочу , чтобы удалить эти типы и свойства и имеют GetSourceValue
получить значение свойства , используя только одну строку в качестве параметра. Я хочу передать класс и свойство в строке и разрешить значение свойства.
Это возможно?
c#
reflection
properties
pedrofernandes
источник
источник
public static T GetPropertyValue<T>(object obj, string propName) { return (T)obj.GetType().GetProperty(propName).GetValue(obj, null); }
src.GetType().GetProperty(propName)?.GetValue(src, null);
";).GetProperty
и бросокPropertyNotFoundException
или что-то, если ноль.)Как насчет чего-то вроде этого:
Это позволит вам перейти в свойства, используя одну строку, например:
Вы можете использовать эти методы как статические методы или как расширения.
источник
PropertyInfo.PropertyType
вместоobj.GetType()
вложенных свойств, как если бы доступ к свойству был вложенным.nameof
выражение из C # 6 следующим образом:nameof(TimeOfDay.Minutes)
в параметре name при вызове функции, чтобы избавиться от магических строк и добавить безопасность этих команд во время компиляции.Добавьте к любому
Class
:Затем вы можете использовать как:
источник
SetValue
иGetValue
методы работают сObject
. Если вам нужно работать с конкретным типом, вы должны привести результатGetValue
и привести значение, чтобы присвоить егоSetValue
Что об использовании
CallByName
вMicrosoft.VisualBasic
пространстве имен (Microsoft.VisualBasic.dll
)? Он использует отражение для получения свойств, полей и методов обычных объектов, объектов COM и даже динамических объектов.а потом
источник
Отличный ответ от jheddings. Я хотел бы улучшить его, разрешив ссылаться на агрегированные массивы или коллекции объектов, чтобы propertyName могло иметь значение property1.property2 [X] .property3:
источник
Если я использую код от Ed S., я получаю
Похоже, что
GetProperty()
не доступно в Xamarin.Forms.TargetFrameworkProfile
являетсяProfile7
в моей Портативной библиотеке классов (.NET Framework 4.5, Windows 8, ASP.NET Core 1.0, Xamarin.Android, Xamarin.iOS, Xamarin.iOS Classic).Теперь я нашел рабочее решение:
Источник
источник
Что касается обсуждения вложенных свойств, вы можете избежать всего, что связано с отражением, если будете использовать
DataBinder.Eval Method (Object, String)
как показано ниже:Конечно, вам нужно добавить ссылку на
System.Web
сборку, но это, вероятно, не имеет большого значения.источник
Метод для вызова изменился в .NET Standard (по состоянию на 1.6). Также мы можем использовать нулевой условный оператор C # 6.
источник
? operator
Использование PropertyInfo пространства имен System.Reflection . Reflection компилируется просто независимо от того, к какому свойству мы пытаемся получить доступ. Ошибка возникнет во время выполнения.
Работает нормально, чтобы получить свойство Location объекта
Мы получим Location: {X = 71, Y = 27} Мы также можем вернуть location.X или location.Y таким же образом.
источник
Это способ получить все свойства с их значениями в списке.
источник
type.GetProperty(pi.Name)
когда это == для переменнойpi
?if
и сделайтеselfValue?.ToString()
иначе. Избавьтесь от негоif
и используйте егоselfValue==null?null:selfValue.ToString()
List<KeyValuePair<
странный, используйте словарьDictionary<string, string>
Следующий код представляет собой рекурсивный метод для отображения всей иерархии всех имен и значений свойств, содержащихся в экземпляре объекта. Этот метод использует упрощенную версию
GetPropertyValue()
ответа AlexD выше в этой теме. Благодаря этой ветке обсуждения я смог понять, как это сделать!Например, я использую этот метод, чтобы показать взрыв или дамп всех свойств в
WebService
ответе, вызывая метод следующим образом:источник
источник
источник
Приведенный ниже метод идеально подходит для меня:
Чтобы получить значение свойства:
Чтобы установить значение свойства:
источник
источник
Вот еще один способ найти вложенное свойство, для которого не требуется строка, указывающая путь вложения. Благодарим Эд С. за метод единственного имущества.
источник
Type.GetProperty
возвращает ли результат,null
а не вызыватьGetValue
и помещатьNullReferenceException
s в цикл.Вы никогда не упоминаете, какой объект вы проверяете, и поскольку вы отклоняете объекты, ссылающиеся на данный объект, я предполагаю, что вы имеете в виду статический объект.
Обратите внимание, что я отметил объект, который проверяется локальной переменной
obj
.null
означает статический, в противном случае установите его на то, что вы хотите. Также обратите внимание, чтоGetEntryAssembly()
это один из немногих доступных методов для получения «работающей» сборки, вы можете поэкспериментировать с ней, если вам трудно загрузить тип.источник
Взгляните на библиотеку Heleonix.Reflection . Вы можете получить / установить / вызвать членов по путям или создать метод получения / установки (лямбда-компиляцию в делегат), который работает быстрее, чем отражение. Например:
Или создайте геттер один раз и кэшируйте для повторного использования (это более производительно, но может вызвать исключение NullReferenceException, если промежуточный член имеет значение null):
Или, если вы хотите создать
List<Action<object, object>>
различные методы получения, просто укажите базовые типы для скомпилированных делегатов (преобразования типов будут добавлены в скомпилированные лямбды):источник
короче ....
источник
jheddings и AlexD оба написали отличные ответы о том, как разрешать строки свойств. Я хотел бы добавить свой микс, поскольку я написал специально для этой цели библиотеку.
Основным классом Pather.CSharp является
Resolver
. По умолчанию он может разрешать свойства, массивы и словарные записи.Так, например, если у вас есть такой объект
и хотите получить
Property2
, вы можете сделать это так:Это самый простой пример путей, которые он может разрешить. Если вы хотите узнать, что еще он может или как вы можете его расширить, просто перейдите на его страницу Github .
источник
Вот мое решение. Он также работает с COM-объектами и позволяет получить доступ к элементам коллекции / массива из COM-объектов.
источник
Вот что я получил, основываясь на других ответах. Немного излишним, когда я стал настолько конкретен с обработкой ошибок.
источник