2013-02-18 16 views
6

'a nasıl iletilir Bazı parametrelerden TypeConverter'den türetilen bir sınıfa geçmek istiyorum. Söyle bana, nasıl yapabilirim? Örneğin , bu sınıf var:Parametre, TypeConverter türetilmiş sınıf

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

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

böyle değer FirstParam geçmek istiyorum: muhtemelen

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

mi?

Görünüşe göre, bu görevin bir kararı yoktur. Bir sorunu yeniden belirtmeyi deneyeceğim. TypeConverter türetilmiş bir sınıfım var ve farklı değerleri aşağıya açılan listeyi göstermek için farklı özelliklere uygulıyorum. ExClassConverter : TypeConverter'dan hangi özelliklerin aşağı açılır listeden uygun değerlerle doldurulacağını nasıl tanımlarım?

[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

Hayır, mümkün değil. En iyi 'çözüm', 'ExClassConverter' öğesinden türetilmiş sınıfları yapıcıda ayarlanan varsayılan değerlerle oluşturmaktır. – leppie

cevap

7

Görevi çözdüm. Ben yöntemler ConvertTo ve ConvertFrom de ITypeDescriptorContext context kullandı: Sadece özellik adı türünü kontrol: Bütünlük açısından ...

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

Eski soruya ancak, neler olduğuna dair çözüm OP'ın sorundur olmak dönüştürücü karşı çağrılıyor. Örneğin, bu çözüm, OP'nin mülke uygulanan ek özniteliğine olan ihtiyacı ortadan kaldırır.

İlgili konular