我有这个属性:
[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的类型。
答案 0 :(得分:2)
您必须跳过多个图层才能获得TypeConverter
(LINQPad 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