这是我第一次发现这个问题的another question的后续行动。如果我在用户控件上创建一个公共属性,类型为System.Type
,我就不能使用该类型的普通字符串表示形式,例如System.Int32
,作为属性的声明性标记属性值。
似乎我需要发现从字符串到类型的转换,以及为System.Type“注入”自定义的内容。我是在正确的轨道上吗?
答案 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。