2012-02-22 3 views
12

Я хочу получить значение для динамического свойства динамического объекта. Вот мой код ..GetProperty ("pname") возвращает null

public string ReturnProperty(object ob, string prop) 
{    
    Type type = ob.GetType(); 
    PropertyInfo pr = type.GetProperty(prop); 

    //Here pr is null..Dont know whats wrong 

    return pr.GetValue(ob, null).ToString(); 
} 
+3

Какие значения '' ob' и prop'? – Curt

+0

Вы можете разработать свой код? –

+0

ob - динамический объект, а prop - динамическое свойство. они генерируют динамику из db. Мне нужно иметь значение dynob.dynprop – incomplete

ответ

24

Я думаю, что либо он не является публичной собственностью, или у вас есть имя неправильно, или оно не является собственностью на всех (кроме общественного поля).

Невозможно сказать больше, не зная, что такое фактический тип, но это должно быть началом.

Вы упомянули, что это «динамический объект», но на самом деле это не очень описательно. Имейте в виду, что сама CLR ничего не знает о DLR - если вы имеете в виду, что это тип, который реализует IDynamicMetaObjectProvider или расширяет DynamicObject, то вы не сможете получить свойства с таким «нормальным» отражением.

+6

У меня была аналогичная проблема, и, действительно, у меня не было собственности, а в публичном поле! Использование FieldInfo вместо PropertyInfo работало для меня. – RussellStewart

0

Попробуйте
Type.GetProperty(String, BindingFlags)
перегрузок и выберите право связывающего флаги.

-1

Я пробовал это & Это сработало.

public string ReturnProperty(object ob, string prop) 
{ 
    Type type = ob.GetType(); 
    PropertyInfo pr = type.GetProperty(prop); 
    //Here pr is null..Dont know whats wrong 
    return pr.GetValue(ob, null).ToString(); 
} 

ReturnProperty(new { abc = 10 }, "abc"); 

Что-то не так ???

+0

Как вы называете 'ReturnProperty (new {abc = 10}," abc ");' before? –

+0

Я понял. – incomplete

0

Пример ExpandoObject (он реализует IDynamicMetaObjectProvider Джон Скит упоминается):

public static string ReturnProperty(object ob, string prop) 
    { 
     if (ob is ExpandoObject) 
     { 
      return ((ExpandoObject)ob).Single(e => e.Key == prop).Value.ToString(); 
     } 
     Type type = ob.GetType(); 
     PropertyInfo pr = type.GetProperty(prop); 
     return pr.GetValue(ob, null).ToString(); 
    } 

    //-- 

    dynamic dyna = new ExpandoObject(); 

    dyna.Name = "Element"; 

    Console.WriteLine(ReturnProperty(dyna, "Name")); 
-1

Я просто наткнулся на этот вопрос, когда я проходил в неправильных данных отсортированном виде сетки в проекте MVC.

 public HolidaysGridViewModel() 
    { 
     this.Sort = "HolidayDate"; // this was the wrong name 
     this.SortDir = "ASC"; 
    } 

Он заставил меня понять, прочитав ваш вопрос, что вы, скорее всего, проходящее во имя бизнеса из базы данных вместо имени объекта столбца базы данных и, следовательно, не были результаты были найдены, которые, возможно, были причина вашего нулевого значения.

6

В моем случае ob не было prгеттер сеттер должным образом.

//causes GetProperty to return null 
public class MyClass{ 
    public object pr; 
} 

//Works 
public class MyClass{ 
    public object pr { get; set; } 
} 
0

В моем случае я должен был определить get и set. См постами выше

public string MyPropertyName { get; set; } 

После этого я мог бы получить в собственность по:

typeof(MyClassItem).GetProperty("PropertyName")