在C#中是否有类似Python的getattr()的东西?

时间:2020-03-06 14:46:06  来源:igfitidea点击:

在C#中是否有类似Python的getattr()的东西?我想通过阅读一个包含要放在窗口上的控件名称的列表来创建一个窗口。

解决方案

为此使用反射。

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

是的,我们可以这样做...

typeof(YourObjectType).GetProperty("PropertyName").GetValue(instanceObjectToGetPropFrom, null);

可以使用object.GetType()。GetProperties()创建System.Reflection.PropertyInfo类。可以用来使用字符串探测对象的属性。 (存在与对象方法,字段等类似的方法)

我认为这不会实现目标。我们可能应该直接创建和操作对象。例如,控件具有我们可以设置的Name属性。

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