У меня есть Dictionary<string, object>
, который содержит имя свойства как string и его значение как объект. У меня также есть продление Bind
метод, который, посредством отражения, устанавливает, что имя Собственость с соответствующим значением:Отражение для имен составных свойств
public static T Bind<T>(this T @this,
Dictionary<string, object> newValues,
params string[] exceptions) where T : class
{
var sourceType = @this.GetType();
foreach (var pair in newValues.Where(v => !exceptions.Contains(v.Key)))
{
var property = sourceType.GetProperty(pair.Key,
BindingFlags.SetProperty |
BindingFlags.Public |
BindingFlags.Instance);
var propType = Nullable.GetUnderlyingType(property.PropertyType) ??
property.PropertyType;
property.SetValue(@this, (pair.Value == null) ? null :
Convert.ChangeType(pair.Value, propType), null);
}
return @this;
}
Например, рассмотрим класс, как это:
public class User
{
public string Name { get; set; }
public DateTime Date { get; set; }
}
Все работает отлично, за исключением того, когда Я получил класс с именем свойства другого объекта, например:
public class User
{
public string Name { get; set; }
public DateTime Date { get; set; }
public Address Address { get; set; }
}
public class Address
{
public string PostalCode { get; set; }
}
Так что, если я пытаюсь отправить имя на Name
свойства, хорошо, бу t У меня возникли проблемы с именами составных свойств, например Address.PostalCode
.
Можете ли вы посоветовать способ справиться с этой ситуацией?
EDIT # 1:
Резюмируя проблему: вызов sourceType.GetProperty("Name", ...)
в контексте экземпляра класса User
правильно позволяет установить его значение, но он не работает, используя sourceType.GetProperty("Address.PostalCode", ...)
в одном экземпляре.
EDIT # 2: Более полный пример должен быть:
var user = new User{ Address = new Address() };
var values = new Dictionary<string, object>
{
{ "Name" , "Sample" },
{ "Date" , DateTime.Today },
{ "Address.PostalCode", "12345" } // Here lies the problem
}
user.Bind(values);
В чем проблема? Что происходит и что вы хотите вместо этого? – fejesjoco
Я просто добавил дополнительную информацию, @fejesjoco –
Вы говорите, что, как будто это небольшая исправляемая ошибка в вашей программе, что путь множественного связывания не работает, но это совершенно новая функция, о которой вы просите. – fejesjoco