我想通过指定一个由点分隔的路径来更新任何公共属性中的值。
但是每当我调用我的方法时,都会在以下行中收到错误:
错误信息:
对象与目标类型不匹配。
我的方法:
但是每当我调用我的方法时,都会在以下行中收到错误:
pi.SetValue(instance, value1, null);
错误信息:
对象与目标类型不匹配。
我的方法:
private void SetPathValue(object instance, string path, object value)
{
string[] pp = path.Split('.');
Type t = instance.GetType();
for (int i = 0; i < pp.Length; i++)
{
PropertyInfo pi = t.GetProperty(pp[i]);
if (pi == null)
{
throw new ArgumentException("Properties path is not correct");
}
else
{
instance = pi.GetValue(instance, null);
t = pi.PropertyType;
if (i == pp.Length - 1)//last
{
// Type targetType = IsNullableType(pi.PropertyType) ? Nullable.GetUnderlyingType(pi.PropertyType) : pi.PropertyType;
var value1 = Convert.ChangeType(value, instance.GetType());
pi.SetValue(instance, value1, null);//ERROR
}
}
}
}
private static bool IsNullableType(Type type)
{
return type.IsGenericType && type.GetGenericTypeDefinition().Equals(typeof(Nullable<>));
}
t.GetProperty
适用于原始对象类型?所以当instance
是MyType
类型并且有一个类型为PropType
的属性MyProperty
时,t
将总是评估为MyType
,而t.GetProperty(pp [1])
返回null,因为pp [1]
是PropType
中的一个属性,而不是MyType
中的一个属性。您需要一个递归方法,仅评估当前级别。 - MakePeaceGreatAgaint
,它不总是原始值。尽管如此,我仍然认为递归评估是更合适的解决方案。 - Bradley Uffner