// Author:
// Miguel de Icaza (miguel@ximian.com)
// Andreas Nahr (ClassDevelopment@A-SoftTech.com)
+// Ivan N. Zlatev (contact@i-nz.net)
//
// (C) Ximian, Inc. http://www.ximian.com
// (C) 2003 Andreas Nahr
+// (C) 2008 Novell, Inc. http://www.novell.com
//
//
public virtual TypeConverter Converter {
get {
- if (converter == null) {
+ if (converter == null && PropertyType != null) {
TypeConverterAttribute at = (TypeConverterAttribute) Attributes [typeof(TypeConverterAttribute)];
- if (at == null || at == TypeConverterAttribute.Default)
- converter = TypeDescriptor.GetConverter (PropertyType);
- else {
- Type t = Type.GetType (at.ConverterTypeName);
- if (t == null) {
- converter = TypeDescriptor.GetConverter (PropertyType);
- }
- else {
- ConstructorInfo ci = t.GetConstructor (new Type[] { typeof(Type) });
- if (ci != null)
- converter = (TypeConverter) ci.Invoke (new object[] { PropertyType });
- else
- converter = (TypeConverter) Activator.CreateInstance (t);
- }
+ if (at != null && at != TypeConverterAttribute.Default) {
+ Type converterType = GetTypeFromName (at.ConverterTypeName);
+ if (converterType != null && typeof (TypeConverter).IsAssignableFrom (converterType))
+ converter = (TypeConverter)CreateInstance (converterType);
}
+ if (converter == null)
+ converter = TypeDescriptor.GetConverter (PropertyType);
}
return converter;
}
public abstract bool ShouldSerializeValue (object component);
- protected object CreateInstance(System.Type type)
+ protected object CreateInstance (Type type)
{
- return Assembly.GetExecutingAssembly ().CreateInstance (type.Name);
+ if (type == null || PropertyType == null)
+ return null;
+
+ object instance = null;
+ Type[] paramTypes = new Type[] { typeof (Type) };
+ ConstructorInfo ctor = type.GetConstructor (paramTypes);
+ if (ctor != null) {
+ object[] parameters = new object[] { PropertyType };
+#if NET_2_0
+ instance = TypeDescriptor.CreateInstance (null, type, paramTypes, parameters);
+#else
+ instance = ctor.Invoke (parameters);
+#endif
+ } else {
+#if NET_2_0
+ instance = TypeDescriptor.CreateInstance (null, type, null, null);
+#else
+ instance = Activator.CreateInstance (type);
+#endif
+ }
+ return instance;
}
public override bool Equals(object obj)
return TypeDescriptor.GetProperties (instance, filter);
}
- public virtual object GetEditor(Type editorBaseType)
+ public virtual object GetEditor (Type editorBaseType)
{
Type t = null;
Attribute [] atts = AttributeArray;
if (ea == null)
continue;
- t = TypeDescriptor.GetTypeFromName (null, ea.EditorTypeName);
+ t = GetTypeFromName (ea.EditorTypeName);
if (t != null && t.IsSubclassOf(editorBaseType))
break;
}
}
+ object editor = null;
if (t != null)
- return TypeDescriptor.CreateEditor (t, PropertyType);
-
- return TypeDescriptor.GetEditor (PropertyType, editorBaseType);
+ editor = CreateInstance (t);
+ if (editor == null)
+ editor = TypeDescriptor.GetEditor (PropertyType, editorBaseType);
+ return editor;
}
- protected Type GetTypeFromName(string typeName)
+ protected Type GetTypeFromName (string typeName)
{
- return Type.GetType (typeName);
+ if (typeName == null || ComponentType == null || typeName.Trim ().Length == 0)
+ return null;
+
+ Type type = Type.GetType (typeName);
+ if (type == null) {
+ // Try to strip the type typeName only
+ int index = typeName.IndexOf (",");
+ if (index != -1)
+ typeName = typeName.Substring (0, index);
+ type = ComponentType.Assembly.GetType (typeName);
+ }
+ return type;
}
}
}
namespace MonoTests.System.ComponentModel
{
+ internal class MyVersionTypeConverter : TypeConverter
+ {
+ }
+
[TestFixture]
public class PropertyDescriptorTests
{
}
}
+ class Converter_test
+ {
+ public virtual Version NoConverter {
+ get { return null; }
+ }
+
+ [TypeConverter (typeof(MyVersionTypeConverter))]
+ public virtual Version WithConverter {
+ get { return null; }
+ }
+
+ [TypeConverter ("MonoTests.System.ComponentModel.MyVersionTypeConverter")]
+ public virtual Version WithConverterNamed {
+ get { return null; }
+ }
+
+ [TypeConverter("System.ComponentModel.CharConverter, " + Consts.AssemblySystem)]
+ public virtual Version WithConverterNamedAssmQuald {
+ get { return null; }
+ }
+
+ public int WithDefaultConverter {
+ get { return 0; }
+ }
+ }
+
+ class ConverterSubclassNotOverridenProperties_test : Converter_test
+ {
+ }
+
+ class ConverterSubclassOverridenProperties_test : Converter_test
+ {
+ public override Version WithConverter {
+ get { return null; }
+ }
+
+ public override Version WithConverterNamed {
+ get { return null; }
+ }
+ }
+
+ class ConverterEmptyConvertersOnOveriddenProperties : Converter_test
+ {
+ [TypeConverter]
+ public override Version WithConverter {
+ get { return null; }
+ }
+
+ [TypeConverter]
+ public override Version WithConverterNamed {
+ get { return null; }
+ }
+ }
+
private ArrayList _invokedHandlers;
[SetUp]
Assert.AreEqual (typeof (StringConverter), p3.Converter.GetType (), "3");
}
+ [Test]
+ public void ConverterTest ()
+ {
+ Assert.AreEqual (typeof (TypeConverter),
+ TypeDescriptor.GetProperties (typeof (Converter_test))["NoConverter"].Converter.GetType (), "#1");
+ Assert.AreEqual (typeof (MyVersionTypeConverter),
+ TypeDescriptor.GetProperties (typeof (Converter_test))["WithConverter"].Converter.GetType (), "#2");
+ Assert.AreEqual (typeof (MyVersionTypeConverter),
+ TypeDescriptor.GetProperties (typeof (Converter_test))["WithConverterNamed"].Converter.GetType (), "#3");
+ Assert.AreEqual (typeof (CharConverter),
+ TypeDescriptor.GetProperties (typeof (Converter_test))["WithConverterNamedAssmQuald"].Converter.GetType (), "#4");
+ Assert.AreEqual (typeof (Int32Converter),
+ TypeDescriptor.GetProperties (typeof (Converter_test))["WithDefaultConverter"].Converter.GetType (), "#5");
+
+ Assert.AreEqual (typeof (TypeConverter),
+ TypeDescriptor.GetProperties (typeof (ConverterSubclassNotOverridenProperties_test))["NoConverter"].Converter.GetType (), "#6");
+ Assert.AreEqual (typeof (MyVersionTypeConverter),
+ TypeDescriptor.GetProperties (typeof (ConverterSubclassNotOverridenProperties_test))["WithConverter"].Converter.GetType (), "#7");
+ Assert.AreEqual (typeof (MyVersionTypeConverter),
+ TypeDescriptor.GetProperties (typeof (ConverterSubclassNotOverridenProperties_test))["WithConverterNamed"].Converter.GetType (), "#8");
+ Assert.AreEqual (typeof (CharConverter),
+ TypeDescriptor.GetProperties (typeof (ConverterSubclassNotOverridenProperties_test))["WithConverterNamedAssmQuald"].Converter.GetType (), "#9");
+ Assert.AreEqual (typeof (Int32Converter),
+ TypeDescriptor.GetProperties (typeof (ConverterSubclassNotOverridenProperties_test))["WithDefaultConverter"].Converter.GetType (), "#10");
+
+ Assert.AreEqual (typeof (TypeConverter),
+ TypeDescriptor.GetProperties (typeof (ConverterSubclassOverridenProperties_test))["NoConverter"].Converter.GetType (), "#11");
+ Assert.AreEqual (typeof (MyVersionTypeConverter),
+ TypeDescriptor.GetProperties (typeof (ConverterSubclassOverridenProperties_test))["WithConverter"].Converter.GetType (), "#12");
+ Assert.AreEqual (typeof (MyVersionTypeConverter),
+ TypeDescriptor.GetProperties (typeof (ConverterSubclassOverridenProperties_test))["WithConverterNamed"].Converter.GetType (), "#13");
+ Assert.AreEqual (typeof (CharConverter),
+ TypeDescriptor.GetProperties (typeof (ConverterSubclassOverridenProperties_test))["WithConverterNamedAssmQuald"].Converter.GetType (), "#14");
+ Assert.AreEqual (typeof (Int32Converter),
+ TypeDescriptor.GetProperties (typeof (ConverterSubclassOverridenProperties_test))["WithDefaultConverter"].Converter.GetType (), "#15");
+
+ Assert.AreEqual (typeof (TypeConverter),
+ TypeDescriptor.GetProperties (typeof (ConverterEmptyConvertersOnOveriddenProperties))["NoConverter"].Converter.GetType (), "#116");
+ Assert.AreEqual (typeof (TypeConverter),
+ TypeDescriptor.GetProperties (typeof (ConverterEmptyConvertersOnOveriddenProperties))["WithConverter"].Converter.GetType (), "#17");
+ Assert.AreEqual (typeof (TypeConverter),
+ TypeDescriptor.GetProperties (typeof (ConverterEmptyConvertersOnOveriddenProperties))["WithConverterNamed"].Converter.GetType (), "#18");
+ Assert.AreEqual (typeof (CharConverter),
+ TypeDescriptor.GetProperties (typeof (ConverterEmptyConvertersOnOveriddenProperties))["WithConverterNamedAssmQuald"].Converter.GetType (), "#19");
+ Assert.AreEqual (typeof (Int32Converter),
+ TypeDescriptor.GetProperties (typeof (ConverterEmptyConvertersOnOveriddenProperties))["WithDefaultConverter"].Converter.GetType (), "#20");
+ }
+
[Test]
public void ShouldSerializeTest_public ()
{