2017-11-16 6 views
1

ターゲットのFx:.NETのCore 2
CsvHelper:6.0.0(最新)Ignore()を使ってクラスの型を無視する方法は?

人CSV

Name 
Nikhil 

人クラス

public class Person { 
    public string Name { get; set; } 
    public Address Address { get; set; } // Address has AddLine1, Addline2 
} 

人地図

public class PersonMap : ClassMap<Person> { 
    public PersonMap() { 
     AutoMap(); 
     Map(p => p.Address).Ignore(); // This causes exception 
    } 
} 

これを行うことによって解決される。

Map(p => p.Address.AddLine1).Ignore(); 
Map(p => p.Address.AddLine2).Ignore(); 

は、現実には、私は無視するクラス型は、小道具の多くを持っています。だから私は、CsvHelperが既に認識していない全タイプ(種類はMap(p => p.Address).Ignore())を無視するために既に用意されているものがあるかどうかを知りたいと思っています。

Fiddle

+0

質問が不明ですか?本当に!!!もう一度それを読んでいただけますか?より多くの情報が必要なことを教えてください。 – niksofteng

答えて

0

私は前にこのライブラリを使用しないので、塩の粒でこれを取る決してしました:

それは参照マッピングではなく、フィールドマッピングとしてAddressをマッピングすることが表示されます。参照マッピングを無視すると実際に何もしないという点で、予期せぬ動作やバグになる可能性が非常に高いです。これを報告する価値があるかもしれません。おそらく、その内部のすべてのフィールドマッピングを再帰的に無視する必要があります。

しかし、回避策があります。参照マッピングを手動で削除します。あなたは拡張機能を記述することができます

public static class Extensions 
{ 
    public static void RemoveReference<T, TT>(this ClassMap<T> classMap, Expression<Func<T, TT>> expr) 
    { 
     var memberExpr = expr.Body as MemberExpression; 
     var member = memberExpr.Member; 
     var referenceMapsToRemove = classMap.ReferenceMaps.Where(rm => rm.Data.Member == member).ToList(); 

     foreach (var referenceMapToRemove in referenceMapsToRemove) 
     { 
      classMap.ReferenceMaps.Remove(referenceMapToRemove); 
     } 
    } 
} 

そして、あなたのコードは次のようになります。

public class PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
     AutoMap(); 
     this.RemoveReference(p => p.Address); 
    } 
} 

私は上で述べたように、私はこのライブラリに非常に精通していませんよ。参照マッピング内のすべてのフィールドマッピングを完全に削除するのではなく、無視するように調整する必要があります。

関連する問題