2009-04-09 12 views
1

これは私が最初にこの問題を発見したanother questionのフォローアップです。ユーザーコントロールでpublicプロパティを作成した場合、タイプがSystem.Typeの場合、通常の文字列表現は使用できません。 System.Int32をプロパティの宣言マークアップ属性値として使用します。ユーザーコントロールのマークアップにSystem.Typeプロパティを実装するにはどうすればよいですか?

文字列から型への変換を行い、System.Typeのカスタム型を '注入'することは何でもわかるはずです。正しい軌道にいるのですか?

答えて

4

TypeConverterが必要です。ほとんどのプリミティブ型にはデフォルトのものがあります。これらはControlBuilderによって使用されます。 .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

1

文字列表現の代わりに型を使用するのはどうですか? typeofでコンパイル時の型を取得することができ、Object.GetType().で実行時の型を取得できます。いずれかがSystem.Typeを返します。

+0

マークアップの属性は文字列でなければなりません。 – ProfK

関連する問題