Есть ли способ в C #, где я могу использовать отражение, чтобы установить свойство объекта?
Пример:
MyObject obj = new MyObject();
obj.Name = "Value";
Я хочу установить obj.Name
с отражением. Что-то вроде:
Reflection.SetProperty(obj, "Name") = "Value";
Есть ли способ сделать это?
c#
.net
reflection
properties
Melursus
источник
источник
var val = Convert.ChangeType(propValue, propInfo.PropertyType);
source: devx.com/vb2themax/Tip/19599obj.GetType().GetProperty("Name")?.GetSetMethod()?.Invoke(...)
CanWrite=False
типов, верно?Вы также можете сделать:
где target - это объект, для которого будет установлено его свойство.
источник
Отражение, в основном, т.е.
или есть библиотеки, которые помогут как с точки зрения удобства, так и производительности; например с FastMember :
(что также имеет то преимущество, что не нужно заранее знать, является ли это поле по сравнению со свойством)
источник
Или вы можете обернуть один вкладыш Марка в свой собственный класс расширения:
и назовите это так:
Для правильной оценки давайте добавим метод для получения значения свойства:
источник
Да, используя
System.Reflection
:источник
Используйте что-то вроде этого:
или
источник
Вы также можете получить доступ к полям, используя аналогичную манеру:
С отражением все может быть открытой книгой :) В моем примере мы привязываемся к частному полю уровня экземпляра.
источник
Вы можете попробовать это, когда хотите массово назначить свойства объекта из другого объекта, используя имена свойств:
источник
Я только что опубликовал пакет Nuget, который позволяет настраивать не только свойства первого уровня, но и вложенные свойства в данном объекте любой глубины.
Вот посылка
Устанавливает значение свойства объекта по его пути от корня.
Объект может быть сложным объектом, а свойство может быть многоуровневым вложенным свойством или может быть свойством непосредственно под корнем.
ObjectWriter
найдет свойство, используя параметр свойства path, и обновит его значение. Путь свойства - это добавленные имена свойств, посещаемых от корня до свойства конечного узла, которое мы хотим установить, ограниченного строковым параметром delimiter.Использование:
Для настройки свойств непосредственно под корнем объекта:
То есть.
LineItem
класс имеет свойство int, называемоеItemId
Для настройки вложенных свойств на нескольких уровнях ниже корня объекта:
То есть.
Invite
У класса есть свойство с именемState
, которое имеет свойствоInvite
(типа приглашения), у которого есть свойствоRecipient
с именемId
.Чтобы сделать вещи еще более сложными,
State
свойство не является ссылочным типом, оно являетсяstruct
.Вот как вы можете установить свойство Id (в строковое значение «outlook») внизу дерева объектов в одной строке.
источник
Основываясь на предложении MarcGravell, я построил следующий статический метод. Метод обычно назначает все подходящие свойства от исходного объекта к цели, используя FastMember
источник