Получить значение свойства конкретного объекта в С# без знания класса

У меня есть объект (.NET) типа " object". Я не знаю " реального типа (класса)" за ним во время выполнения, но я знаю, что у объекта есть свойство " имя строки". Как я могу получить значение "имя"? Возможно ли это?

что-то вроде этого:

object item = AnyFunction(....);
string value = item.name;

Ответ 1

Использовать отражение

System.Reflection.PropertyInfo pi = item.GetType().GetProperty("name");
String name = (String)(pi.GetValue(item, null));

Ответ 2

Вы можете сделать это, используя dynamic вместо object:

dynamic item = AnyFuncton(....);
string value = item.name;

Ответ 3

Отражение может помочь вам.

var someObject;
var propertyName = "PropertyWhichValueYouWantToKnow";
var propertyName = someObject.GetType().GetProperty(propertyName).GetValue(someObject, null);

Ответ 4

Доступ к рефлексии и динамическому значению - это правильные решения этого вопроса, но они довольно медленные. Если вы хотите что-то быстрее, вы можете создать динамический метод с помощью выражений:

  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);

Этот способ выполняется быстрее, если кешировать созданные функции. Например, в словаре, где ключ будет фактическим типом объекта, предполагая, что имя свойства не изменяется или некоторая комбинация типа и имени свойства.

Ответ 5

Просто попробуйте это для всех свойств объекта,

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.