如何在用户控件的标记中实现System.Type属性?

时间:2009-04-09 17:43:12

标签: .net asp.net

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

似乎我需要发现从字符串到类型的转换,以及为System.Type“注入”自定义的内容。我是在正确的轨道上吗?

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:1)

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

相关问题