2009-04-09 19 views
1

这是我第一次发现这个问题后,我的another question。如果我在我的用户控件上创建一个公共属性,类型为System.Type,那么我不能使用该类型的正常字符串表示形式,例如, System.Int32,作为属性的声明性标记属性值。如何在用户控件的标记中实现System.Type属性?

似乎我需要揭示无论是从字符串到类型的转换,并为System.Type“注入”一个自定义类型。我在正确的轨道上吗?

回答

4

您需要一个TypeConverter。大多数基元类型都有默认的类型。它们被ControlBuilders使用。 .NET可能已经有了一些System.Type,但我不知道任何。所以,这里是你怎么可以添加自己:

在页面:

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

用户控件代码隐藏:

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; 
    } 
} 
+0

谢谢@Ruslan。我怀疑涉及TypeConverter的东西,但并不知道如何或什么。这很棒! – ProfK 2009-04-10 10:19:48

1

如何使用类型而不是使用字符串表示形式?您可以使用typeof获得编译时类型,并且您可以使用Object.GetType().获得运行时类型任何一个都会返回一个System.Type。

+0

马克 - 达属性必须是字符串。 – ProfK 2009-04-10 10:20:50

相关问题