Кажется, что Type.InvokeMember не работает с классом short,int16 или другим 16-битным числовым типом класса.
public class Test{
public string name{get;set}
public short age{get;set;}
}
....
var type = typeof(Test);
var ins = Activator.CreateInstance(type);
type.InvokeMember("name", BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.SetProperty, null, ins ,new object[] { "alibaba" });
type.InvokeMember("age", BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.SetProperty | BindingFlags.SetField | BindingFlags.SuppressChangeType, null, ins ,new object[] { 2 });
...
Исключение метода 'age' не найден throw при запуске, если я изменяю тип 'age' на int или другой числовой тип 32+, он работает
Независимо от того, поддерживает ли InvokeMember тип short,int16 ect. Или я мог бы изменить другой способ присвоения значения.
Любая помощь приветствуется
1 ответ
Решение
Можете ли вы попробовать это. Это сработало для меня.
//credit to stack overflow post and the following post
//https://stackru.com/questions/1089123/setting-a-property-by-reflection-with-a-string-value
Test test = new Test();
PropertyInfo property = typeof(Test).GetProperty("name");
property.SetValue(test, "NameValue", null);
PropertyInfo propertyTwo = typeof(Test).GetProperty("age");
short aShort = 49;
propertyTwo.SetValue(test, aShort, null);