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

Ответ 1

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

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

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

Ответ 2

В моем случае ob не имеет pr setter setter.

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

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

Ответ 3

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

Ответ 4

Пример для ExpandoObject (он реализует IDynamicMetaObjectProvider Jon Skeet):

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

Ответ 5

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

public string MyPropertyName { get; set; }

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

typeof(MyClassItem).GetProperty("PropertyName")

Ответ 6

Я пробовал это, и он работал.

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

Что не так???

Ответ 7

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

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

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