РЕДАКТИРОВАТЬ Протестировал его с помощью int, bool, double и string, и он сработал, также добавил проверку, чтобы убедиться, что свойство существует, и выдает исключение, которого нет (возможно, нужно изменить исключениевведите)
РЕДАКТИРОВАТЬ 2 : временное решение, добавит больше типов названий к методу конвертации или, если кто-то может предложить более динамичный способ его приведения (если нет, то я предполагаю, что у вас будетзнать все типы, которые будут использоваться)?
EDIT3 Украл метод преобразования из другого вопроса (Крис Тейлор), спасибо: -)
public void setProperty(object containingObject, string propertyName, object newValue)
{
if (containingObject.GetType().GetProperties().Count(c => c.Name == propertyName) > 0)
{
var type = containingObject.GetType().GetProperties().First(c => c.Name == propertyName).PropertyType;
object val = Convert(type,(string)newValue);
containingObject.GetType().InvokeMember(propertyName, BindingFlags.SetProperty, null, containingObject, new object[] { val });
}
else
{
throw new KeyNotFoundException("The property: " + propertyName + " was not found in: " + containingObject.GetType().Name);
}
}
public object convert(System.Type type, string value)
{
return Convert.ChangeType(value, type);
}
Взято из http://www.haslo.ch/blog/setproperty-and-getproperty-with-c-reflection/
Было бы интересно узнать, работает ли это, создайте быстрый тест:
class testSettings
{
public bool SetBool { get; set; }
public void setProperty(object containingObject, string propertyName, object newValue)
{
if (containingObject.GetType().GetProperties().Count(c => c.Name == propertyName) > 0)
{
containingObject.GetType().InvokeMember(propertyName, BindingFlags.SetProperty, null, containingObject, new object[] { newValue });
}
else
{
throw new KeyNotFoundException("The property: " + propertyName + " was not found in: " + containingObject.GetType().Name);
}
}
}
static void Main(string[] args)
{
testSettings ts = new testSettings();
ts.SetBool = false;
ts.setProperty(ts, "SetBool", true);
Console.WriteLine(ts.SetBool.ToString());
Console.Read();
}
Вывод верен, но не совсем уверен, будет ли он правильно конвертировать все типы.