2017-06-28 5 views
0

私は、WebからHTMLテーブルを取得してオブジェクトに変換するライブラリを作成しています。オブジェクトに直接データをマッピングするC#

config.Column().Text().MapTo(/*Class.TextPropertyName*/); //What I want to be able to do 
config.Column().Date().MapTo(/*Class.DatePropertyName*/); 

上記のコードは(最初の関数が作成されますのでご注意私が構成で行うことができるようにしたいものの一般的な考え方です:私は、特定のテーブルがレイアウトされている方法を事前に設定することColumnConfiguratorオブジェクトを持っています新しい列を返し、それを返し、その後のメソッドは、オブジェクトの設定を設定します)、テーブルがマップされているとき私はMapToに渡されたパラメータを取得し、自動的に特定のオブジェクトの正しいプロパティに解決する。

ここで私は最も混乱しています。理論的にはどのオブジェクトにもマップできるように、メインテーブルオブジェクトを汎用(ParsingTable<T>)にします。つまり、事前に利用可能なプロパティはありません。私はT.Propertyをメソッドに渡して、オートマトンする方法を知っています。これを行う方法はありますか?私は反射について少しは読んだが、それはパフォーマンスにとって悪いと聞いた。

+0

あなたは多くは正確にあなたが求めているものを理解することはその容易ではないので、ここで起こっています。 'var item = config.SomeMethod()。SomeOtherMethod();'のような構文をしたいなら、**拡張メソッド**が必要です。リフレクションせずにプロパティを設定したジェネリックを使用する場合は、共通の抽象クラス(つまり、インタフェース、抽象クラス、基本クラス)を見つけて、汎用メソッドをその抽象クラスに限定する必要があります。その後、汎用メソッドからその抽象メンバのいずれかにアクセスできます。 – maccettura

答えて

1

(あなたが設定のために何をしているか)流れるようなインターフェイスの作成については、こちらをご覧ください:creating API that is fluent

をMapTo方法についての一般的なクラスからプロパティ名を受け入れるために、あなたのようなものとなってしまいますこの:あなたは構文解析を行っているとき

public class ParsingTable<T> 
{ 
    /*** All the other stuff ***/ 

    public static IColumnConfiguration MapTo(this IColumnConfiguration config, Expression<Func<T, object>> property) 
    { 
     if (property.Body is MemberExpression) 
     { 
     config.Property = (property.Body as MemberExpression).Member as PropertyInfo; 
     } 
     else 
     { 
     config.Property = (((UnaryExpression)property.Body).Operand as MemberExpression).Member as PropertyInfo; 
     } 
    } 
} 

public interface IColumnConfiguration 
{ 
    PropertyInfo Property { get; set; } 
} 

その後、あなたはそれぞれの値/列にPropertyInfo.SetValue()関数を呼び出します。

これは、ダイレクトプロパティセットと比較して、少し遅い可能性があります。これが大きな問題であるかどうかは、状況によって大きく異なります。次のステップは、実際にSetValue()呼び出しを避けたい場合は、各列セットのラムダ式をコンパイルすることです。

注、私はここから上記のコードの一部を取っ:http://blog.raffaeu.com/archive/2010/06/26/how-to-write-fluent-interface-with-c-and-lambda.aspx

+0

多くのおかげで、このソリューションは完璧に動作します! – w0ffen

関連する問題