这是我第一次发现这个问题后,我的another question。如果我在我的用户控件上创建一个公共属性,类型为System.Type
,那么我不能使用该类型的正常字符串表示形式,例如, System.Int32
,作为属性的声明性标记属性值。如何在用户控件的标记中实现System.Type属性?
似乎我需要揭示无论是从字符串到类型的转换,并为System.Type“注入”一个自定义类型。我在正确的轨道上吗?
这是我第一次发现这个问题后,我的another question。如果我在我的用户控件上创建一个公共属性,类型为System.Type
,那么我不能使用该类型的正常字符串表示形式,例如, System.Int32
,作为属性的声明性标记属性值。如何在用户控件的标记中实现System.Type属性?
似乎我需要揭示无论是从字符串到类型的转换,并为System.Type“注入”一个自定义类型。我在正确的轨道上吗?
您需要一个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;
}
}
如何使用类型而不是使用字符串表示形式?您可以使用typeof获得编译时类型,并且您可以使用Object.GetType().获得运行时类型任何一个都会返回一个System.Type。
马克 - 达属性必须是字符串。 – ProfK 2009-04-10 10:20:50
谢谢@Ruslan。我怀疑涉及TypeConverter的东西,但并不知道如何或什么。这很棒! – ProfK 2009-04-10 10:19:48