前もって、私はのAutoMapperについて知っています。私はそれを使いたくありません。私はC#を学んでいるので、それを深く見たいと思っています。だから私は自分自身でこの問題を解決しようとしています。1つのオブジェクトのプロパティ値を別のオブジェクトに転送する
しかし、プロパティと同じ名前と型を持ち、ソースから読み取り可能であり、ターゲットで書き込み可能な場合、あるタイプのプロパティの値を別のプロパティの値に対応させるためのプロパティコピーを作成しようとしています。私はtype.GetProperties()
メソッドを使用しています。
static void Transfer(object source, object target) {
var sourceType = source.GetType();
var targetType = target.GetType();
var sourceProps = sourceType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
var targetProps = (from t in targetType.GetProperties()
where t.CanWrite
&& (t.GetSetMethod().Attributes & MethodAttributes.Static) == 0
select t).ToList();
foreach(var prop in sourceProps) {
var value = prop.GetValue(source, null);
var tProp = targetProps
.FirstOrDefault(p => p.Name == prop.Name &&
p.PropertyType.IsAssignableFrom(prop.PropertyType));
if(tProp != null)
tProp.SetValue(target, value, null);
}
}
それは動作しますが、私はSystem.Reflection.Emit
とILGenerator
とを使用して遅延バインディング、デリゲートは、より迅速で、より高い性能を持っていることを、SOの答えを読む:サンプリング方法がここにあります。しかし、それ以上の説明やリンクはありませんでした。このコードをスピードアップする方法を理解できるように助けてください。またはEmit
、ILGenerator
、および遅延バインドの代表者に関するリンクを教えてもらえますか?それとも、私が題材にするのに役立つと思いますか?前もって感謝します。
COMPELETE Q:
私は理解してsvickの答え@から多くのことを学びます。しかし今、オープンなジェネリックメソッドとして使用したい場合は、どうすればいいのですか?
public TTarget Transfer<TSource, TTarget>(TSource source) where TTarget : class, new() { }
または拡張子:このような何か
public static TTarget Transfer<TSource, TTarget>(this TSource source) where TTarget : class, new() { }
私はSystem.Reflection.Emitがここでお手伝いするとは思わない。あなたの場合、ソースオブジェクトとターゲットオブジェクトの両方がコンパイル時に存在し、対応するプロパティの値を一方から他方にコピーするだけです。実行時に(例えば)ターゲットタイプを作成したい場合は、Emitが役に立ちます。 –