如何获取属性

时间:2018-03-09 23:57:48

标签: c# typeconverter

我有这个属性:

    [DisplayName("Conexión")]
    [TypeConverter(typeof(Converters.DevicesTypeConverter))]
    [Description("Conexión con el dispositivo a usar.")]
    [Required]
    public string Conexion { get; set; }

我需要获取它的类型转换器实例。我尝试过:

        PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(this);
        PropertyDescriptor property = properties.Find("Conexion", false);
        var converter = TypeDescriptor.GetConverter(property);

即使有:

        PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(this);
        PropertyDescriptor property = properties.Find("Conexion", false);
        var converter = TypeDescriptor.GetConverter(property.PropertyType);

有了这个,我只能获得属性类型的转换器,即字符串类型的转换器,而不是实际的属性转换器,DevicesTypeConverter。

请帮忙吗?

编辑:

我要做的是以下内容。我在类中有2个属性,我需要通过属性网格来设置。

" Conexion" property是依赖于其他属性的值列表。

这种依赖很有效:

当其他属性发生变化时,我会扩展" Conexion"属性,GetStandardValues支持方法" Conexion"叫做。在该方法中,我使用" context.Instance"调用以这种方式检索列表的对象实例上的方法:

    public List<object> GetDevicesList()
    {
        if (this.Driver == null)
            return null;

        var devices = this.Driver.GetList();

        if (devices == null)
            return null;

        return devices.Select(l => (object)l.Value).ToList();
    }

返回的列表存储在转换器中的私有变量中,因此这完美地显示了依赖于其他属性的列表。

到目前为止一切顺利。当对象的属性中已有值时,会发生此问题。自从&#34; Conexion&#34;是独占的,当我将它分配给属性网格时,它的属性值显示为空。

这是显而易见的,因为仅在调用GetStandardValuesSupported时才会填充依赖列表,并且只有在我尝试编辑属性时才会发生这种情况。

现在我需要我在问题中提出的问题。我需要在对象构造函数中显式调用GetStandardValuesSupported,以强制在&#34; Conexion&#34;之前加载依赖列表。财产被分配。有了这个,我确信该属性将显示为初始化,因为列表将具有其值。

我认为您的解决方案应该有效,但GetConverter返回null。问题只是调用我的自定义类型转换器的GetStandardValuesSupported()所以我也可以使用Activator.CreateInstance,但问题是转换器的类型是null而不是DevicesTypeConverter的类型。

2 个答案:

答案 0 :(得分:2)

您必须跳过多个图层才能获得TypeConverterLINQPad demo)中指定的TypeConverterAttribute的实例:

//Get the type you are interested in.
var type = typeof(MyClass); 

//Get information about the property you are interested in on the type.
var prop = type.GetProperty("Conexion"); 

//Pull off the TypeConverterAttribute.
var attr = prop.GetCustomAttribute<TypeConverterAttribute>();

//The attribute only stores the name of the TypeConverter as a string.
var converterTypeName = attr.ConverterTypeName; 

// Get the actual Type of the TypeConverter from the string.
var converterType = Type.GetType(converterTypeName); 

//Create an instance of the TypeConverter.
var converter = (TypeConverter) Activator.CreateInstance(converterType); 

现在您可以使用现有的获取转换器的方法:

var converter = TypeDescriptor.GetConverter(converterType);

答案 1 :(得分:0)

你很亲密。获得感兴趣的属性的PropertyDescriptor后,使用Converter属性获取Converter。

PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(this);
PropertyDescriptor propertyDescriptor = properties.Find("Conexion", false);

propertyDescriptor.Converter // <- This is what you want