tags:

views:

89

answers:

2

This is a follow up to another question of mine where I first found this problem. If I create a public property on my User Control, with a type of System.Type, I cannot use a normal string representation of the type, e.g. System.Int32, as a declarative markup attribute value for the property.

It seems I need to uncover whatever it is that does the conversion from string to type, and 'inject' a custom one for System.Type. Am I on the right track?

+1  A: 

How about just using the type instead of using the string representation? You can get the compile-time type with typeof and you can get the run-time type with Object.GetType(). Either one returns a System.Type.

JP Alioto
Mark-up attributes have to be strings.
ProfK
+2  A: 

You need a TypeConverter. Most of primitive types have default ones. They are used by ControlBuilders. .NET may already have something for the System.Type, but I don't know of any. So, here is how you could add your own:

On page:

<uc1:WebUserControl1 ID="WebUserControl11" runat="server" MyProperty="System.Int32" />

User control code behind:

using System.ComponentModel;

public partial class WebUserControl1 : System.Web.UI.UserControl
{
 [TypeConverter(typeof(MyTypeConverter))]
 public System.Type MyProperty { get; set; }

 protected void Page_Load(object sender, EventArgs e)
 {
  //dummy user web control, simply outputs property's value
  Response.Write(MyProperty.ToString());
 }
}

public class MyTypeConverter : TypeConverter
{
 public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
 {
  return ((sourceType == typeof(string)) || base.CanConvertFrom(context, sourceType));
 }

 public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
 {
  if (value is string)
  {
   string str = ((string)value).Trim();
   try
   {
    return Type.GetType(str);
   }
   catch (FormatException exception)
   {
    throw new FormatException(string.Format("ConvertInvalidPrimitive={0} is not a valid value for {1}.", value, "System.Type"), exception);
   }
  }
  return base.ConvertFrom(context, culture, value);
 }

 public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
 {
  return false;
 }
}
Ruslan
Thanks @Ruslan. I suspected something involving a TypeConverter, but didn't have a clue how or what. This is great!
ProfK