Ответ 1
Использовать отражение
System.Reflection.PropertyInfo pi = item.GetType().GetProperty("name");
String name = (String)(pi.GetValue(item, null));
У меня есть объект (.NET) типа " object". Я не знаю " реального типа (класса)" за ним во время выполнения, но я знаю, что у объекта есть свойство " имя строки". Как я могу получить значение "имя"? Возможно ли это?
что-то вроде этого:
object item = AnyFunction(....);
string value = item.name;
Использовать отражение
System.Reflection.PropertyInfo pi = item.GetType().GetProperty("name");
String name = (String)(pi.GetValue(item, null));
Вы можете сделать это, используя dynamic
вместо object
:
dynamic item = AnyFuncton(....);
string value = item.name;
Отражение может помочь вам.
var someObject;
var propertyName = "PropertyWhichValueYouWantToKnow";
var propertyName = someObject.GetType().GetProperty(propertyName).GetValue(someObject, null);
Доступ к рефлексии и динамическому значению - это правильные решения этого вопроса, но они довольно медленные. Если вы хотите что-то быстрее, вы можете создать динамический метод с помощью выражений:
object value = GetValue();
string propertyName = "MyProperty";
var parameter = Expression.Parameter(typeof(object));
var cast = Expression.Convert(parameter, value.GetType());
var propertyGetter = Expression.Property(cast, propertyName);
var castResult = Expression.Convert(propertyGetter, typeof(object));//for boxing
var propertyRetriver = Expression.Lambda<Func<object, object>>(castResult, parameter).Compile();
var retrivedPropertyValue = propertyRetriver(value);
Этот способ выполняется быстрее, если кешировать созданные функции. Например, в словаре, где ключ будет фактическим типом объекта, предполагая, что имя свойства не изменяется или некоторая комбинация типа и имени свойства.
Просто попробуйте это для всех свойств объекта,
foreach (var prop in myobject.GetType().GetProperties(BindingFlags.Public|BindingFlags.Instance))
{
var propertyName = prop.Name;
var propertyValue = myobject.GetType().GetProperty(propertyName).GetValue(myobject, null);
//Debug.Print(prop.Name);
//Debug.Print(Functions.convertNullableToString(propertyValue));
Debug.Print(string.Format("Property Name={0} , Value={1}", prop.Name, Functions.convertNullableToString(propertyValue)));
}
ПРИМЕЧАНИЕ: Функции .convertNullableToString() - это настраиваемая функция, использующая для преобразования значения NULL в string.empty.