Есть ли что-то вроде getattr () Python в C #? - PullRequest
13 голосов
/ 26 сентября 2008

Есть ли что-то вроде getattr () Python в C #? Я хотел бы создать окно, прочитав список, содержащий имена элементов управления, которые нужно поместить в окно.

Ответы [ 4 ]

9 голосов
/ 26 сентября 2008

Существует также Type.InvokeMember .

public static class ReflectionExt
{
    public static object GetAttr(this object obj, string name)
    {
        Type type = obj.GetType();
        BindingFlags flags = BindingFlags.Instance | 
                                 BindingFlags.Public | 
                                 BindingFlags.GetProperty;

        return type.InvokeMember(name, flags, Type.DefaultBinder, obj, null);
    }
}

Что может быть использовано как:

object value = ReflectionExt.GetAttr(obj, "PropertyName");

или (в качестве метода расширения):

object value = obj.GetAttr("PropertyName");
3 голосов
/ 26 сентября 2008

Используйте отражение для этого.

Type.GetProperty() и Type.GetProperties() каждый возвращает PropertyInfo экземпляров, которые можно использовать для считывания значения свойства объекта.

var result = typeof(DateTime).GetProperty("Year").GetValue(dt, null)

Type.GetMethod() и Type.GetMethods() каждый возврат MethodInfo экземпляров, которые можно использовать для выполнения метода над объектом.

var result = typeof(DateTime).GetMethod("ToLongDateString").Invoke(dt, null);

Если вы не обязательно знаете тип (который будет немного странным, если вы обновите имя свойства), то вы могли бы также сделать что-то подобное.

var result = dt.GetType().GetProperty("Year").Invoke(dt, null);
1 голос
/ 26 сентября 2008

Да, вы можете сделать это ...

typeof(YourObjectType).GetProperty("PropertyName").GetValue(instanceObjectToGetPropFrom, null);
0 голосов
/ 26 сентября 2008

Существует класс System.Reflection.PropertyInfo, который можно создать с помощью object.GetType (). GetProperties (). Это можно использовать для проверки свойств объекта с использованием строк. (Подобные методы существуют для методов объекта, полей и т. Д.)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...