8

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;
}
}
4

2 に答える 2

9

私はその課題を解決しました。ITypeDescriptorContext contextConvertToメソッドとConvertFromメソッドで使用しました。

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());
}
于 2013-02-18T10:02:10.423 に答える
4

古い質問ですが...

完全を期すために、OPの問題と思われるものの解決策は次のとおりです。型コンバーターが呼び出されているプロパティ名を確認するだけです。例えば、

public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
    StandardValuesCollection svc;
    if (context.PropertyDescriptor.Name == "Bounds")
        svc = new StandardValuesCollection(LSValues1);
    else if (context.PropertyDescriptor.Name == "Rounds")
        svc = new StandardValuesCollection(LSValues2);
    return svc;
}

このソリューションにより、OP の余分な属性をプロパティに適用する必要がなくなります。

于 2014-10-20T15:28:03.357 に答える