2017-09-20 20 views
0

が見つかりません。これは、基本的には、質問の続きです:Typeconverter not working for single propertiesのTypeConverterがプロパティ

元の質問には答えマークしたが、特に以来、すべての私のプロジェクトで特定のシナリオのために進むべき道であることを思えていませんでした私の読書はそれが本当に機能するはずであることを示唆している私はそれを打ち明けましたが、最後のコメントで述べたのと同じ問題が発生しました(ブレークポイントが当たっていないか、私の場合、結果ウィンドウに出力がダンプされません)。私の必要性のための基本的な例に徹底的に取りかかっています。

LINQPad

void Main() 
{ 
    var prop = typeof(Request).GetProperty("Names"); 
    var converter = TypeDescriptor.GetConverter(prop.PropertyType.Dump()).Dump(); 
    var value = converter.ConvertFrom("One,Two").Dump(); 
} 

public class Request 
{ 
    [TypeConverter(typeof(EnumerableTypeConverter<string>))] 
    public IEnumerable<string> Names { get; set; } 
} 

public class EnumerableTypeConverter<T> : TypeConverter 
{ 
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
    { 
     new { Context = context, SourceType = sourceType }.Dump("CanConvertFrom"); 

     if (sourceType == typeof(string)) 
      return true; 

     return false; 
    } 

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) 
    { 
     new { Context = context, DestinationType = destinationType }.Dump("CanConvertTo"); 

     return true; 
    } 

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     new { Context = context, Culture = culture, Value = value }.Dump("ConvertFrom"); 

     var source = value as string; 

     if (source == null) 
      return value.ToString(); 

     return source; 
    } 

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) 
    { 
     new { Context = context, Culture = culture, Value = value, DestinationType = destinationType }.Dump("ConvertTo"); 

     var s = value as IEnumerable<string>; 

     return s != null ? string.Join(",", s) : base.ConvertFrom(context, culture, value); 
    } 

    public override bool IsValid(ITypeDescriptorContext context, object value) 
    { 
     new { Context = context, Value = value }.Dump("IsValid"); 

     return true; 
    } 
} 

では、出力はそれが2)それは私の習慣を見つけていない、TypeConverterAttribute定義を見ていない

typeof(IEnumerable<String>) 
System.Collections.Generic.IEnumerable`1[System.String] 

ReferenceConverter 
System.ComponentModel.ReferenceConverter 

null 

この問題は1の1であることを示唆している)でありますTypeConverter、または3)それを作成できず、自動的に失敗します。それらのすべてはそう思わないが、明らかに結果は嘘ではない。従って、私の理解の何かが間違っています。インスタンスを直接インスタンス化すると、例外が発生しませんでした。

var testConverter = new EnumerableTypeConverter<string>().Dump(); 

EnumerableTypeConverter<String> 
UserQuery+EnumerableTypeConverter`1[System.String] 

はにやにや笑いと笑いのために、私は非ジェネリックアプローチ

[TypeConverter(typeof(EnumerableStringConverter))] 
public IEnumerable<string> Names { get; set; } 

public class EnumerableStringConverter : TypeConverter 
{ 
    // -- same implementation as EnumerableTypeConverter<T> -- 
} 

を試してみましたが、同じ結果を受け取りました。私はここで何が欠けていますか?


†コードは、プロパティ名と関連する値を含むファイルを読み込みます。次に、一致するプロパティを名前で検索し、コンバーターを介して値を設定します。実際の値のいくつかはJSON配列ですが、デシリアライズされたJSON配列を一致プロパティに返す完全なソリューションを作成する前に、私が行っていたことを検証するための小さな手順を取っていました。

答えて

2

コンバータをプロパティに設定すると、このプロパティのコンバータはタイプIEnumerable<string>でなくなります。

static void Main(string[] args) 
{ 
    var properties = TypeDescriptor.GetProperties(typeof(Request)); 
    var propItem = properties["Names"]; 
    var converter = propItem.Converter; 
    // converter has type {EnumerableTypeConverter<string>} 
} 
関連する問題