2013-02-18 15 views
6

TypeConverterから派生したクラスにいくつかのパラメータを渡したいと思います。私に教えてください、どうすればいいですか?例えば 、私はこのクラスを持っている:TypeConverter派生クラスにパラメータを渡す方法

public class DDlExample 
{ 
     [TypeConverter(typeof(ExClassConverter))] 
     public int Bounds { get; set; } 
} 

class ExClassConverter : TypeConverter 
{ 
    public int FirstParam{get;set;} 
... 
} 

私はこのような値FirstParam渡ししたいと思います:それはおそらく

public class DDlExample 
{ 
     [TypeConverter(typeof(ExClassConverter), ***FirstParam=2***)] 
     public int Bounds { get; set; } 
} 

ですが?

このタスクは決まっていないようです。私は問題を再現しようとします。 私はTypeConverterから派生した1つのクラスを持っており、異なるプロパティをドロップダウンリストで表示するためにそれを別のプロパティに適用します。 ExClassConverter : TypeConverterからドロップダウンリストに適切な値を入力するプロパティを定義するにはどうすればよいですか?

[AttributeUsage(AttributeTargets.Property,AllowMultiple=true,Inherited=true)] 
public class ParamDesc:Attribute 
{ 
    public ParamDesc(int PD) { DictID = PD; } 
    public int DictID { get; set; } 
} 

public class DDlExample 
{ 
    [ParamDesc(1)] 
    [TypeConverter(typeof(ExClassConverter))] 
    public int Bounds { get; set; } 

    [ParamDes(2)] 
    [TypeConverter(typeof(ExClassConverter))] 
    public int Rounds { get; set; } 
} 

class ExClassConverter : TypeConverter 
{ 

private List<string> LSValues1 = new List<string>(new string[] {"first","second","third"}); 
private List<string> LSValues2 = new List<string>(new string[] {"apple","melon","grapes"}); 

public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
{ 
    if (sourceType == typeof(string)) 
     return true; 
    return base.CanConvertFrom(context, sourceType); 

} 

public override bool CanConvertTo(ITypeDescriptorContext context, Type sourceType) 
{    
    if (sourceType == typeof(int)) 
      return (sourceType == typeof(int)?true:false); 
    return base.CanConvertTo(context, sourceType); 
} 

public override object ConvertTo(ITypeDescriptorContext context, 
    CultureInfo culture, object value, Type destType) 
{ 
     if (value is int) 
     {   
      return LSValues1[(int)value]; 
     } 
     return base.ConvertTo(context, culture, value, destType); 
} 
public override object ConvertFrom(ITypeDescriptorContext context, 
CultureInfo culture, object value) 
{ 
    if (value is string) 
    { 
     return LSValues1.IndexOf(value.ToString()); 
    } 
    return base.ConvertFrom(context, culture, value); 

} 

public override bool GetStandardValuesSupported(ITypeDescriptorContext context) 
{ 
    return true; 
} 

public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) 
{ 
    return true; 
} 

public override TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) 
{ 
    StandardValuesCollection svc = new StandardValuesCollection(LSValues1); 
    return svc; 
} 
} 
+0

いいえ、できません。ベストな「解決策」は、コンストラクタで設定されたデフォルトを使用して、ExClassConverterから派生クラスを作成することです。 – leppie

答えて

7

私はこの課題を解決しました。私は方法をConvertToとConvertFromでITypeDescriptorContext contextを使用:完全を期すために

if (context != null) 
{ 
    AttributeCollection ua = context.PropertyDescriptor.Attributes;      
    ParamDesc cca = (ParamDesc)ua[typeof(ParamDesc)];  
    if (cca != null) 
     System.Console.WriteLine("Attribute value is " + cca.DictID.ToString()); 
} 
4

古い質問を、しかし...、OPの問題のように見える何のためのソリューションです:ちょうどプロパティ名を確認タイプコンバータが呼び出されています。この解決策は、OPの追加属性がプロパティに適用される必要性を回避します。

関連する問題